From fb505d807df1dffe3161e51f08e44c182fe696f4 Mon Sep 17 00:00:00 2001 From: Peter Smythe Date: Wed, 6 Sep 2023 19:07:11 +0200 Subject: [PATCH 01/34] Update index.rst (#7105) --- doc/en/developer/source/release-guide/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/en/developer/source/release-guide/index.rst b/doc/en/developer/source/release-guide/index.rst index 866b0570f4c..fbff15fd05a 100644 --- a/doc/en/developer/source/release-guide/index.rst +++ b/doc/en/developer/source/release-guide/index.rst @@ -216,6 +216,8 @@ Download and try out some of the artifacts from the above location and do a quick smoke test that there are no issues. Engage other developers to help test on the developer list. +It is important to test the artifacts using the minimum supported version of Java (currently Java 11 in September 2023). + Publish the Release ------------------- From e9f8b40071c76c4101a19c749b30bd24e6ee011a Mon Sep 17 00:00:00 2001 From: Daniele Romagnoli Date: Fri, 8 Sep 2023 10:53:11 +0200 Subject: [PATCH 02/34] [GEOS-11116] GetMap/GetFeatureInfo with groups and view params can with mismatched layers/params (#7107) Co-authored-by: Andrea Aime --- .../wms/map/GetMapKvpRequestReader.java | 36 ++- .../wms/map/GetMapKvpRequestReaderTest.java | 219 +++++++++--------- 2 files changed, 142 insertions(+), 113 deletions(-) diff --git a/src/wms/src/main/java/org/geoserver/wms/map/GetMapKvpRequestReader.java b/src/wms/src/main/java/org/geoserver/wms/map/GetMapKvpRequestReader.java index d8123e22a2c..a40372857f2 100644 --- a/src/wms/src/main/java/org/geoserver/wms/map/GetMapKvpRequestReader.java +++ b/src/wms/src/main/java/org/geoserver/wms/map/GetMapKvpRequestReader.java @@ -463,7 +463,7 @@ public GetMapRequest read(Object request, Map kvp, Map> viewParams = getMap.getViewParams(); if (viewParams != null && !viewParams.isEmpty()) { - applyViewParams(getMap, viewParams); + applyViewParams(getMap, viewParams, requestedLayerInfos); } // check if layers have time/elevation support @@ -554,17 +554,38 @@ private void addLayersFromGroup( } } - private void applyViewParams(GetMapRequest getMap, List> viewParams) { + private void applyViewParams( + GetMapRequest getMap, + List> viewParams, + List requestedLayerInfos) { int layerCount = getMap.getLayers().size(); + if (viewParams.size() == layerCount) return; - // if we have just one replicate over all layers + List> replacement = new ArrayList<>(); if (viewParams.size() == 1 && layerCount > 1) { - List> replacement = new ArrayList<>(); + // if we have just one replicate over all layers for (int i = 0; i < layerCount; i++) { replacement.add(viewParams.get(0)); } - getMap.setViewParams(replacement); - } else if (viewParams.size() != layerCount) { + } else { + // expand based on group/layer/other + for (int i = 0; i < requestedLayerInfos.size(); i++) { + Object o = requestedLayerInfos.get(i); + Map layerParams = viewParams.get(i); + if (o instanceof LayerGroupInfo) { + LayerGroupInfo groupInfo = (LayerGroupInfo) o; + List layers = groupInfo.layers(); + if (layers != null) layers.stream().forEach(l -> replacement.add(layerParams)); + } else { + replacement.add(layerParams); + } + } + } + getMap.setViewParams(replacement); + + // final check, did we re-align? otherwiser report based on original list, + // that is, what the user actually provided + if (replacement.size() != layerCount) { String msg = layerCount + " layers requested, but found " @@ -572,6 +593,9 @@ private void applyViewParams(GetMapRequest getMap, List> vie + " view params specified. "; throw new ServiceException(msg, getClass().getName()); } + + // update view params + } @SuppressWarnings("PMD.ForLoopCanBeForeach") diff --git a/src/wms/src/test/java/org/geoserver/wms/map/GetMapKvpRequestReaderTest.java b/src/wms/src/test/java/org/geoserver/wms/map/GetMapKvpRequestReaderTest.java index 29e6e4abd1d..ddf4a88bac8 100644 --- a/src/wms/src/test/java/org/geoserver/wms/map/GetMapKvpRequestReaderTest.java +++ b/src/wms/src/test/java/org/geoserver/wms/map/GetMapKvpRequestReaderTest.java @@ -5,6 +5,7 @@ */ package org.geoserver.wms.map; +import static org.geoserver.data.test.MockData.BASIC_POLYGONS; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; @@ -114,14 +115,14 @@ protected void oneTimeSetUp() throws Exception { CatalogBuilder cb = new CatalogBuilder(getCatalog()); LayerGroupInfo gi = cf.createLayerGroup(); gi.setName("testGroup"); - gi.getLayers().add(getCatalog().getLayerByName(MockData.BASIC_POLYGONS.getLocalPart())); + gi.getLayers().add(getCatalog().getLayerByName(BASIC_POLYGONS.getLocalPart())); gi.getStyles().add(getCatalog().getStyleByName("polygon")); cb.calculateLayerGroupBounds(gi); getCatalog().add(gi); LayerGroupInfo gi2 = cf.createLayerGroup(); gi2.setName("testGroup2"); - gi2.getLayers().add(getCatalog().getLayerByName(MockData.BASIC_POLYGONS.getLocalPart())); + gi2.getLayers().add(getCatalog().getLayerByName(BASIC_POLYGONS.getLocalPart())); gi2.getStyles().add(getCatalog().getStyleByName("raster")); gi2.getLayers().add(getCatalog().getLayerByName(MockData.BUILDINGS.getLocalPart())); gi2.getStyles().add(getCatalog().getStyleByName("raster")); @@ -208,10 +209,8 @@ public void testCreateRequest() throws Exception { @Test public void testReadMandatory() throws Exception { HashMap raw = new HashMap(); - raw.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); - raw.put("styles", MockData.BASIC_POLYGONS.getLocalPart()); + raw.put("layers", getLayerId(BASIC_POLYGONS)); + raw.put("styles", BASIC_POLYGONS.getLocalPart()); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); raw.put("bbox", "-10,-10,10,10"); @@ -222,7 +221,7 @@ public void testReadMandatory() throws Exception { GetMapRequest request = reader.createRequest(); request = reader.read(request, parseKvp(raw), caseInsensitiveKvp(raw)); - String layer = MockData.BASIC_POLYGONS.getLocalPart(); + String layer = BASIC_POLYGONS.getLocalPart(); assertEquals(1, request.getLayers().size()); assertTrue(request.getLayers().get(0).getName().endsWith(layer)); @@ -282,9 +281,9 @@ public void testDefaultStyle() throws Exception { HashMap raw = new HashMap(); raw.put( "layers", - MockData.BASIC_POLYGONS.getPrefix() + BASIC_POLYGONS.getPrefix() + ":" - + MockData.BASIC_POLYGONS.getLocalPart() + + BASIC_POLYGONS.getLocalPart() + "," + MockData.BUILDINGS.getPrefix() + ":" @@ -299,8 +298,7 @@ public void testDefaultStyle() throws Exception { GetMapRequest request = reader.createRequest(); request = reader.read(request, parseKvp(raw), caseInsensitiveKvp(raw)); assertEquals(2, request.getStyles().size()); - LayerInfo basicPolygons = - getCatalog().getLayerByName(MockData.BASIC_POLYGONS.getLocalPart()); + LayerInfo basicPolygons = getCatalog().getLayerByName(BASIC_POLYGONS.getLocalPart()); LayerInfo buildings = getCatalog().getLayerByName(MockData.BUILDINGS.getLocalPart()); assertEquals(basicPolygons.getDefaultStyle().getStyle(), request.getStyles().get(0)); assertEquals(buildings.getDefaultStyle().getStyle(), request.getStyles().get(1)); @@ -309,7 +307,7 @@ public void testDefaultStyle() throws Exception { @Test public void testInterpolations() throws Exception { HashMap kvp = new HashMap(); - kvp.put("layers", getLayerId(MockData.BASIC_POLYGONS)); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("interpolations", "bicubic"); GetMapRequest request = reader.createRequest(); @@ -322,11 +320,11 @@ public void testInterpolations() throws Exception { kvp.put( "layers", - getLayerId(MockData.BASIC_POLYGONS) + getLayerId(BASIC_POLYGONS) + "," - + getLayerId(MockData.BASIC_POLYGONS) + + getLayerId(BASIC_POLYGONS) + "," - + getLayerId(MockData.BASIC_POLYGONS)); + + getLayerId(BASIC_POLYGONS)); kvp.put("interpolations", "bicubic,,bilinear"); request = reader.createRequest(); request = reader.read(request, parseKvp(kvp), caseInsensitiveKvp(kvp)); @@ -369,7 +367,7 @@ public void testInterpolationsForLayerGroups() throws Exception { assertNotNull(request.getInterpolations().get(1)); assertTrue(request.getInterpolations().get(1) instanceof InterpolationBicubic); - kvp.put("layers", "testGroup2,testGroup," + getLayerId(MockData.BASIC_POLYGONS)); + kvp.put("layers", "testGroup2,testGroup," + getLayerId(BASIC_POLYGONS)); kvp.put("interpolations", "bicubic,bilinear,nearest neighbor"); request = reader.createRequest(); @@ -386,7 +384,7 @@ public void testInterpolationsForLayerGroups() throws Exception { assertNotNull(request.getInterpolations().get(3)); assertTrue(request.getInterpolations().get(3) instanceof InterpolationNearest); - kvp.put("layers", "testGroup2,testGroup," + getLayerId(MockData.BASIC_POLYGONS)); + kvp.put("layers", "testGroup2,testGroup," + getLayerId(BASIC_POLYGONS)); kvp.put("interpolations", ",bilinear"); request = reader.createRequest(); @@ -404,7 +402,7 @@ public void testInterpolationsForLayerGroups() throws Exception { @Test public void testFilter() throws Exception { HashMap kvp = new HashMap(); - kvp.put("layers", getLayerId(MockData.BASIC_POLYGONS)); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("filter", ""); GetMapRequest request = reader.createRequest(); @@ -450,7 +448,7 @@ public void testFeatureId() throws Exception { @Test public void testSortBy() throws Exception { HashMap kvp = new HashMap(); - kvp.put("layers", getLayerId(MockData.BASIC_POLYGONS)); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("sortBy", "FID D"); GetMapRequest request = reader.createRequest(); @@ -486,7 +484,7 @@ public void testSortByGroup() throws Exception { @Test public void testSortByLessThanRequired() throws Exception { Map kvp = new HashMap<>(); - kvp.put("layers", getLayerId(MockData.BASIC_POLYGONS) + "," + getLayerId(MockData.LAKES)); + kvp.put("layers", getLayerId(BASIC_POLYGONS) + "," + getLayerId(MockData.LAKES)); kvp.put("sortBy", "FID D"); GetMapRequest request = reader.createRequest(); @@ -510,9 +508,7 @@ public void testSldNoDefault() throws Exception { // the kvp should be already in decoded form String decoded = URLDecoder.decode(url.toExternalForm(), "UTF-8"); kvp.put("sld", decoded); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); GetMapRequest request = reader.createRequest(); reader.setLaxStyleMatchAllowed(false); @@ -532,9 +528,7 @@ public void testSldDefault() throws Exception { URL url = GetMapKvpRequestReader.class.getResource("BasicPolygonsLibraryDefault.sld"); String decoded = URLDecoder.decode(url.toExternalForm(), "UTF-8"); kvp.put("sld", decoded); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); GetMapRequest request = reader.createRequest(); request = reader.read(request, parseKvp(kvp), kvp); @@ -568,9 +562,7 @@ public void testSldCache() throws Exception { HashMap kvp = new HashMap(); String url = "http://cached_sld"; kvp.put("sld", url); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); GetMapRequest request = reader.createRequest(); request = reader.read(request, parseKvp(kvp), kvp); @@ -607,9 +599,7 @@ public void testSldCacheNotEnabled() throws Exception { HashMap kvp = new HashMap(); String url = "http://cached_sld"; kvp.put("sld", url); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); GetMapRequest request = reader.createRequest(); request = reader.read(request, parseKvp(kvp), kvp); @@ -630,9 +620,7 @@ public void testSldDisabled() throws Exception { URL url = GetMapKvpRequestReader.class.getResource("BasicPolygonsLibraryDefault.sld"); String decoded = URLDecoder.decode(url.toExternalForm(), "UTF-8"); kvp.put("sld", decoded); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); WMS wms = new WMS(getGeoServer()); WMSInfo oldInfo = wms.getGeoServer().getService(WMSInfo.class); @@ -657,9 +645,7 @@ public void testSldDisabled() throws Exception { public void testSldBodyDisabled() throws Exception { HashMap kvp = new HashMap(); kvp.put("sld_body", STATES_SLD); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); WMS wms = new WMS(getGeoServer()); WMSInfo oldInfo = wms.getGeoServer().getService(WMSInfo.class); @@ -687,9 +673,7 @@ public void testSldNamed() throws Exception { URL url = GetMapKvpRequestReader.class.getResource("BasicPolygonsLibraryNoDefault.sld"); String decoded = URLDecoder.decode(url.toExternalForm(), "UTF-8"); kvp.put("sld", decoded); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "TheLibraryModeStyle"); GetMapRequest request = reader.createRequest(); @@ -708,9 +692,7 @@ public void testSldFailLookup() throws Exception { HashMap kvp = new HashMap(); URL url = GetMapKvpRequestReader.class.getResource("BasicPolygonsLibraryNoDefault.sld"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -731,9 +713,7 @@ public void testSldConnectionFailure() throws Exception { URL url = new URL("http://hostthatdoesnotexist/"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -774,9 +754,7 @@ private void requestWithHeaders( throws Exception { String urlDecoded = URLDecoder.decode(url.toExternalForm(), "UTF-8"); HashMap kvp = new HashMap(); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("sld", urlDecoded); try (InputStream sld = @@ -823,9 +801,7 @@ public void testSldNotExist() throws Exception { URL url = new URL(GetMapKvpRequestReaderTest.class.getResource(""), "does-not-exist"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -846,9 +822,7 @@ public void testSldNotXML() throws Exception { URL url = GetMapKvpRequestReaderTest.class.getResource("paletted.tif"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -871,9 +845,7 @@ public void testSldNotSld() throws Exception { "WMSPostLayerGroupNonDefaultStyle.xml"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -906,7 +878,7 @@ public void testSldFeatureTypeConstraints() throws Exception { // check the layer assertEquals(1, request.getLayers().size()); MapLayerInfo layer = request.getLayers().get(0); - assertEquals(getLayerId(MockData.BASIC_POLYGONS), layer.getName()); + assertEquals(getLayerId(BASIC_POLYGONS), layer.getName()); // check the filter imposed in the feature type constraint FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); assertEquals(1, layer.getLayerFeatureConstraints().length); @@ -922,9 +894,7 @@ public void testSldLibraryFeatureTypeConstraints() throws Exception { URL url = GetMapKvpRequestReader.class.getResource("BasicPolygonsFeatureTypeConstaint.sld"); String decoded = URLDecoder.decode(url.toExternalForm(), "UTF-8"); kvp.put("sld", decoded); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "TheLibraryModeStyle"); GetMapRequest request = reader.createRequest(); @@ -939,7 +909,7 @@ public void testSldLibraryFeatureTypeConstraints() throws Exception { // check the layer assertEquals(1, request.getLayers().size()); MapLayerInfo layer = request.getLayers().get(0); - assertEquals(getLayerId(MockData.BASIC_POLYGONS), layer.getName()); + assertEquals(getLayerId(BASIC_POLYGONS), layer.getName()); // check the filter imposed in the feature type constraint FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); assertEquals(1, layer.getLayerFeatureConstraints().length); @@ -966,7 +936,7 @@ public void testRemoteWFS() throws Exception { HashMap raw = new HashMap(); raw.put("layers", "topp:states"); - raw.put("styles", MockData.BASIC_POLYGONS.getLocalPart()); + raw.put("styles", BASIC_POLYGONS.getLocalPart()); raw.put("format", "image/png"); raw.put("srs", "epsg:4326"); raw.put("bbox", "-100,20,-60,50"); @@ -1053,7 +1023,7 @@ public void testGroupInSLD() throws Exception { assertEquals(1, request.getLayers().size()); assertEquals(1, request.getStyles().size()); - assertEquals(getLayerId(MockData.BASIC_POLYGONS), request.getLayers().get(0).getName()); + assertEquals(getLayerId(BASIC_POLYGONS), request.getLayers().get(0).getName()); Style expectedStyle = getCatalog().getStyleByName("polygon").getStyle(); assertEquals(expectedStyle, request.getStyles().get(0)); } @@ -1061,7 +1031,7 @@ public void testGroupInSLD() throws Exception { @Test public void testViewParams() throws Exception { HashMap raw = new HashMap(); - raw.put("layers", getLayerId(MockData.BASIC_POLYGONS)); + raw.put("layers", getLayerId(BASIC_POLYGONS)); raw.put("styles", ""); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); @@ -1085,9 +1055,7 @@ public void testViewParams() throws Exception { @Test public void testMultipleViewParams() throws Exception { HashMap raw = new HashMap(); - raw.put( - "layers", - getLayerId(MockData.BASIC_POLYGONS) + "," + getLayerId(MockData.BASIC_POLYGONS)); + raw.put("layers", getLayerId(BASIC_POLYGONS) + "," + getLayerId(BASIC_POLYGONS)); raw.put("styles", ""); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); @@ -1113,12 +1081,9 @@ public void testMultipleViewParams() throws Exception { assertEquals("FOO", viewParams.get("str")); } - @Test - public void testFanOutViewParams() throws Exception { + /** Base request without layers */ + private HashMap setupBaseViewParamsRequest() { HashMap raw = new HashMap(); - raw.put( - "layers", - getLayerId(MockData.BASIC_POLYGONS) + "," + getLayerId(MockData.BASIC_POLYGONS)); raw.put("styles", ""); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); @@ -1127,6 +1092,13 @@ public void testFanOutViewParams() throws Exception { raw.put("width", "800"); raw.put("request", "GetMap"); raw.put("service", "wms"); + return raw; + } + + @Test + public void testFanOutViewParams() throws Exception { + HashMap raw = setupBaseViewParamsRequest(); + raw.put("layers", getLayerId(BASIC_POLYGONS) + "," + getLayerId(BASIC_POLYGONS)); raw.put("viewParams", "where:WHERE PERSONS > 1000000;str:ABCD"); GetMapRequest request = reader.createRequest(); @@ -1142,6 +1114,61 @@ public void testFanOutViewParams() throws Exception { assertEquals("ABCD", viewParams.get("str")); } + @Test + public void testFanOutViewParamsGroupFirst() throws Exception { + HashMap raw = setupBaseViewParamsRequest(); + raw.put( + "layers", + "testGroup2," + getLayerId(BASIC_POLYGONS) + "," + getLayerId(BASIC_POLYGONS)); + raw.put("viewParams", "test:123,where:WHERE PERSONS > 1000000,str:ABCD"); + + GetMapRequest request = reader.createRequest(); + request = reader.read(request, parseKvp(raw), caseInsensitiveKvp(raw)); + + List> viewParamsList = request.getViewParams(); + assertEquals(4, viewParamsList.size()); + assertEquals(Map.of("test", "123"), viewParamsList.get(0)); + assertEquals(Map.of("test", "123"), viewParamsList.get(1)); + assertEquals(Map.of("where", "WHERE PERSONS > 1000000"), viewParamsList.get(2)); + assertEquals(Map.of("str", "ABCD"), viewParamsList.get(3)); + } + + @Test + public void testFanOutViewParamsGroupMid() throws Exception { + HashMap raw = setupBaseViewParamsRequest(); + raw.put("layers", getLayerId(BASIC_POLYGONS) + ",testGroup2," + getLayerId(BASIC_POLYGONS)); + raw.put("viewParams", "where:WHERE PERSONS > 1000000,test:123,str:ABCD"); + + GetMapRequest request = reader.createRequest(); + request = reader.read(request, parseKvp(raw), caseInsensitiveKvp(raw)); + + List> viewParamsList = request.getViewParams(); + assertEquals(4, viewParamsList.size()); + assertEquals(Map.of("where", "WHERE PERSONS > 1000000"), viewParamsList.get(0)); + assertEquals(Map.of("test", "123"), viewParamsList.get(1)); + assertEquals(Map.of("test", "123"), viewParamsList.get(2)); + assertEquals(Map.of("str", "ABCD"), viewParamsList.get(3)); + } + + @Test + public void testFanOutViewParamsGroupLast() throws Exception { + HashMap raw = setupBaseViewParamsRequest(); + raw.put( + "layers", + getLayerId(BASIC_POLYGONS) + "," + getLayerId(BASIC_POLYGONS) + ",testGroup2"); + raw.put("viewParams", "where:WHERE PERSONS > 1000000,str:ABCD,test:123"); + + GetMapRequest request = reader.createRequest(); + request = reader.read(request, parseKvp(raw), caseInsensitiveKvp(raw)); + + List> viewParamsList = request.getViewParams(); + assertEquals(4, viewParamsList.size()); + assertEquals(Map.of("where", "WHERE PERSONS > 1000000"), viewParamsList.get(0)); + assertEquals(Map.of("str", "ABCD"), viewParamsList.get(1)); + assertEquals(Map.of("test", "123"), viewParamsList.get(2)); + assertEquals(Map.of("test", "123"), viewParamsList.get(3)); + } + @Test public void testMissingLayersAndStylesParametersWithSld() throws Exception { URL url = GetMapKvpRequestReader.class.getResource("BasicPolygonsLibraryNoDefault.sld"); @@ -1177,10 +1204,8 @@ public void testMissingLayersAndStylesParametersWithSld() throws Exception { public void testMissingCrsParameterInGetMapRequest11() throws Exception { // Fix [GEOS-9646]: INSPIRE validation get errors of GetMapRequest parameters. HashMap raw = new HashMap(); - raw.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); - raw.put("styles", MockData.BASIC_POLYGONS.getLocalPart()); + raw.put("layers", getLayerId(BASIC_POLYGONS)); + raw.put("styles", BASIC_POLYGONS.getLocalPart()); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); raw.put("bbox", "-10,-10,10,10"); @@ -1207,10 +1232,8 @@ public void testMissingCrsParameterInGetMapRequest11() throws Exception { private void validateMissingParameterInGetMapRequest13(String paramToRemove) throws Exception { // Fix [GEOS-9646]: INSPIRE validation get errors of GetMapRequest parameters. HashMap raw = new HashMap(); - raw.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); - raw.put("styles", MockData.BASIC_POLYGONS.getLocalPart()); + raw.put("layers", getLayerId(BASIC_POLYGONS)); + raw.put("styles", BASIC_POLYGONS.getLocalPart()); raw.put("format", "image/jpeg"); raw.put("crs", "epsg:3003"); raw.put("bbox", "-10,-10,10,10"); @@ -1251,10 +1274,8 @@ public void testMissingCrsParameterInGetMapRequest13() throws Exception { public void testTransparencyValueInInspireGetMapRequest() throws Exception { // Fix [GEOS-9646]: INSPIRE validation get errors of GetMapRequest parameters. HashMap raw = new HashMap(); - raw.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart()); - raw.put("styles", MockData.BASIC_POLYGONS.getLocalPart()); + raw.put("layers", getLayerId(BASIC_POLYGONS)); + raw.put("styles", BASIC_POLYGONS.getLocalPart()); raw.put("format", "image/jpeg"); raw.put("crs", "epsg:3003"); raw.put("bbox", "-10,-10,10,10"); @@ -1297,11 +1318,7 @@ public void testSldTooLongLookup() throws Exception { HashMap kvp = new HashMap(); URL url = new URL("http://localhost:" + port + "/sld/style.sld"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() - + ":" - + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -1341,11 +1358,7 @@ public void testSldTimeoutLookup() throws Exception { HashMap kvp = new HashMap(); URL url = new URL("http://localhost:" + port + "/sld/style.sld"); kvp.put("sld", URLDecoder.decode(url.toExternalForm(), "UTF-8")); - kvp.put( - "layers", - MockData.BASIC_POLYGONS.getPrefix() - + ":" - + MockData.BASIC_POLYGONS.getLocalPart()); + kvp.put("layers", getLayerId(BASIC_POLYGONS)); kvp.put("styles", "ThisStyleDoesNotExists"); GetMapRequest request = reader.createRequest(); @@ -1375,11 +1388,7 @@ public void testXMLMultipleViewParams() throws Exception { owsRequest.getRawKvp().put("viewParamsFormat", "XML"); Dispatcher.REQUEST.set(owsRequest); HashMap raw = new HashMap(); - raw.put( - "layers", - getLayerId(MockData.BASIC_POLYGONS) - + "," - + getLayerId(MockData.BASIC_POLYGONS)); + raw.put("layers", getLayerId(BASIC_POLYGONS) + "," + getLayerId(BASIC_POLYGONS)); raw.put("styles", ""); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); @@ -1418,11 +1427,7 @@ public void testXMLMultipleViewParamsServiceException() throws Exception { owsRequest.getRawKvp().put("viewParamsFormat", "unknown-format"); Dispatcher.REQUEST.set(owsRequest); HashMap raw = new HashMap(); - raw.put( - "layers", - getLayerId(MockData.BASIC_POLYGONS) - + "," - + getLayerId(MockData.BASIC_POLYGONS)); + raw.put("layers", getLayerId(BASIC_POLYGONS) + "," + getLayerId(BASIC_POLYGONS)); raw.put("styles", ""); raw.put("format", "image/jpeg"); raw.put("srs", "epsg:3003"); From 5bda1795542cf1da00b4833fe0a95cb492e3e1e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:07:30 +0100 Subject: [PATCH 03/34] Bump com.github.tomakehurst:wiremock-jre8-standalone in /src (#7112) Bumps [com.github.tomakehurst:wiremock-jre8-standalone](https://github.com/wiremock/wiremock) from 2.35.0 to 2.35.1. - [Release notes](https://github.com/wiremock/wiremock/releases) - [Commits](https://github.com/wiremock/wiremock/compare/2.35.0...2.35.1) --- updated-dependencies: - dependency-name: com.github.tomakehurst:wiremock-jre8-standalone dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pom.xml b/src/pom.xml index b63db059517..7744ebda615 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -1512,7 +1512,7 @@ com.github.tomakehurst wiremock-jre8-standalone - 2.35.0 + 2.35.1 From cac5c81fbbde6f1f9791e9c7493e7a3779a1aa29 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Mon, 11 Sep 2023 17:08:36 +0200 Subject: [PATCH 04/34] Follow up update of org.geotools.data DataStore interfaces move --- ...toreFactorySpi => org.geotools.api.data.DataStoreFactorySpi} | 0 ...toreFactorySpi => org.geotools.api.data.DataStoreFactorySpi} | 0 src/community/ogcapi/ogcapi-tiles/pom.xml | 2 +- ...ataAccessFactory => org.geotools.api.data.DataAccessFactory} | 0 ...ataAccessFactory => org.geotools.api.data.DataAccessFactory} | 0 ...ataAccessFactory => org.geotools.api.data.DataAccessFactory} | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename src/community/ogcapi/dggs/dggs-clickhouse/src/main/resources/META-INF/services/{org.geotools.data.DataStoreFactorySpi => org.geotools.api.data.DataStoreFactorySpi} (100%) rename src/community/ogcapi/dggs/dggs-core/src/main/resources/META-INF/services/{org.geotools.data.DataStoreFactorySpi => org.geotools.api.data.DataStoreFactorySpi} (100%) rename src/community/oseo/oseo-core/src/main/resources/META-INF/services/{org.geotools.data.DataAccessFactory => org.geotools.api.data.DataAccessFactory} (100%) rename src/community/schemaless-features/mongodb-schemaless/src/main/resources/META-INF/services/{org.geotools.data.DataAccessFactory => org.geotools.api.data.DataAccessFactory} (100%) rename src/community/smart-data-loader/src/main/resources/META-INF/services/{org.geotools.data.DataAccessFactory => org.geotools.api.data.DataAccessFactory} (100%) diff --git a/src/community/ogcapi/dggs/dggs-clickhouse/src/main/resources/META-INF/services/org.geotools.data.DataStoreFactorySpi b/src/community/ogcapi/dggs/dggs-clickhouse/src/main/resources/META-INF/services/org.geotools.api.data.DataStoreFactorySpi similarity index 100% rename from src/community/ogcapi/dggs/dggs-clickhouse/src/main/resources/META-INF/services/org.geotools.data.DataStoreFactorySpi rename to src/community/ogcapi/dggs/dggs-clickhouse/src/main/resources/META-INF/services/org.geotools.api.data.DataStoreFactorySpi diff --git a/src/community/ogcapi/dggs/dggs-core/src/main/resources/META-INF/services/org.geotools.data.DataStoreFactorySpi b/src/community/ogcapi/dggs/dggs-core/src/main/resources/META-INF/services/org.geotools.api.data.DataStoreFactorySpi similarity index 100% rename from src/community/ogcapi/dggs/dggs-core/src/main/resources/META-INF/services/org.geotools.data.DataStoreFactorySpi rename to src/community/ogcapi/dggs/dggs-core/src/main/resources/META-INF/services/org.geotools.api.data.DataStoreFactorySpi diff --git a/src/community/ogcapi/ogcapi-tiles/pom.xml b/src/community/ogcapi/ogcapi-tiles/pom.xml index 20186cca475..ae336e575dc 100644 --- a/src/community/ogcapi/ogcapi-tiles/pom.xml +++ b/src/community/ogcapi/ogcapi-tiles/pom.xml @@ -99,7 +99,7 @@ org.geowebcache gwc-mbtiles - 1.20-SNAPSHOT + ${gwc.version} test diff --git a/src/community/oseo/oseo-core/src/main/resources/META-INF/services/org.geotools.data.DataAccessFactory b/src/community/oseo/oseo-core/src/main/resources/META-INF/services/org.geotools.api.data.DataAccessFactory similarity index 100% rename from src/community/oseo/oseo-core/src/main/resources/META-INF/services/org.geotools.data.DataAccessFactory rename to src/community/oseo/oseo-core/src/main/resources/META-INF/services/org.geotools.api.data.DataAccessFactory diff --git a/src/community/schemaless-features/mongodb-schemaless/src/main/resources/META-INF/services/org.geotools.data.DataAccessFactory b/src/community/schemaless-features/mongodb-schemaless/src/main/resources/META-INF/services/org.geotools.api.data.DataAccessFactory similarity index 100% rename from src/community/schemaless-features/mongodb-schemaless/src/main/resources/META-INF/services/org.geotools.data.DataAccessFactory rename to src/community/schemaless-features/mongodb-schemaless/src/main/resources/META-INF/services/org.geotools.api.data.DataAccessFactory diff --git a/src/community/smart-data-loader/src/main/resources/META-INF/services/org.geotools.data.DataAccessFactory b/src/community/smart-data-loader/src/main/resources/META-INF/services/org.geotools.api.data.DataAccessFactory similarity index 100% rename from src/community/smart-data-loader/src/main/resources/META-INF/services/org.geotools.data.DataAccessFactory rename to src/community/smart-data-loader/src/main/resources/META-INF/services/org.geotools.api.data.DataAccessFactory From 6d2d76b147c33e6e642e90809b6d7349b1abfd63 Mon Sep 17 00:00:00 2001 From: Joseph Miller Date: Wed, 6 Sep 2023 13:40:42 -0400 Subject: [PATCH 05/34] [GEOS-11118] Add Temporal Extents domain and datetime parameter to Maps API unit tests for caps and cleanup added datetime cleanup cleanup2 more cleanup datetime info test cleanup hardcoded gwc version sort pom html format copyright --- .../ogcapi/v1/maps/CollectionDocument.java | 23 +++++-- .../geoserver/ogcapi/v1/maps/MapsService.java | 54 +++++++++++++-- .../ogcapi/v1/maps/collection_include.ftl | 4 ++ .../ogcapi/v1/maps/CollectionTest.java | 25 +++++++ .../geoserver/ogcapi/v1/maps/MapsTest.java | 69 +++++++++++++++++++ .../ogcapi/v1/maps/MapsTestSupport.java | 31 +++++++++ .../maps/TimeElevationWithStartEnd.properties | 4 ++ 7 files changed, 202 insertions(+), 8 deletions(-) create mode 100644 src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTest.java create mode 100644 src/community/ogcapi/ogcapi-maps/src/test/resources/org/geoserver/ogcapi/v1/maps/TimeElevationWithStartEnd.properties diff --git a/src/community/ogcapi/ogcapi-maps/src/main/java/org/geoserver/ogcapi/v1/maps/CollectionDocument.java b/src/community/ogcapi/ogcapi-maps/src/main/java/org/geoserver/ogcapi/v1/maps/CollectionDocument.java index a5781e2ac3c..91ce866fb0e 100644 --- a/src/community/ogcapi/ogcapi-maps/src/main/java/org/geoserver/ogcapi/v1/maps/CollectionDocument.java +++ b/src/community/ogcapi/ogcapi-maps/src/main/java/org/geoserver/ogcapi/v1/maps/CollectionDocument.java @@ -5,6 +5,7 @@ package org.geoserver.ogcapi.v1.maps; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.io.IOException; import java.util.logging.Logger; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.LayerInfo; @@ -15,11 +16,13 @@ import org.geoserver.ogcapi.CollectionExtents; import org.geoserver.ogcapi.LinkInfoConverter; import org.geoserver.ogcapi.LinksBuilder; +import org.geoserver.ogcapi.TimeExtentCalculator; import org.geoserver.platform.ServiceException; import org.geotools.api.referencing.FactoryException; import org.geotools.api.referencing.operation.TransformException; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.geotools.util.DateRange; import org.geotools.util.logging.Logging; import org.springframework.http.HttpStatus; @@ -30,7 +33,7 @@ public class CollectionDocument extends AbstractCollectionDocument rawParamers = new LinkedHashMap<>(); if (bbox != null) rawParamers.put("bbox", bbox); if (crs != null) rawParamers.put("crs", crs); @@ -304,8 +321,37 @@ private GetMapRequest toGetMapRequest( rawParamers.put("height", String.valueOf(height)); rawParamers.put("layers", collectionId); rawParamers.put("styles", styleId); + rawParamers.put("datetime", datetime); request.setRawKvp(rawParamers); // TODO: add other parameters return request; } + + private void setupTimeSubset(String datetime, PublishedInfo p, GetMapRequest request) + throws ParseException { + if (!(p instanceof LayerInfo)) { + throw new APIException( + APIException.INVALID_PARAMETER_VALUE, + "Can only handle time subset on layers, not layer groups", + HttpStatus.BAD_REQUEST); + } + LayerInfo layer = (LayerInfo) p; + DimensionInfo time = + layer.getResource().getMetadata().get(ResourceInfo.TIME, DimensionInfo.class); + if (time == null || !time.isEnabled()) { + throw new APIException( + INVALID_PARAMETER_VALUE, + "Time dimension is not enabled in this coverage", + HttpStatus.BAD_REQUEST); + } + @SuppressWarnings("unchecked") + Collection times = timeParser.parse(datetime); + if (times.size() != 1) { + throw new APIException( + INVALID_PARAMETER_VALUE, + "Invalid datetime specification, must be a single time, or a time range", + HttpStatus.BAD_REQUEST); + } + request.setTime(List.copyOf(times)); + } } diff --git a/src/community/ogcapi/ogcapi-maps/src/main/resources/org/geoserver/ogcapi/v1/maps/collection_include.ftl b/src/community/ogcapi/ogcapi-maps/src/main/resources/org/geoserver/ogcapi/v1/maps/collection_include.ftl index 7a08b7b3b37..28d48eea265 100644 --- a/src/community/ogcapi/ogcapi-maps/src/main/resources/org/geoserver/ogcapi/v1/maps/collection_include.ftl +++ b/src/community/ogcapi/ogcapi-maps/src/main/resources/org/geoserver/ogcapi/v1/maps/collection_include.ftl @@ -13,6 +13,10 @@ + <#if collection.extent.temporal??> + <#assign temporal = collection.extent.temporal> +
  • Temporal extent: ${temporal.minValue?datetime?iso_utc}/${temporal.maxValue?datetime?iso_utc}
  • +
  • Map styles. <#-- TODO when upgrading Freemaker add ?no_esc to avoid html escaping --> diff --git a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionTest.java b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionTest.java index d92d45157f7..d022064f0a1 100644 --- a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionTest.java +++ b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionTest.java @@ -4,11 +4,13 @@ */ package org.geoserver.ogcapi.v1.maps; +import static org.geoserver.catalog.ResourceInfo.TIME; import static org.junit.Assert.assertEquals; import com.jayway.jsonpath.DocumentContext; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogBuilder; +import org.geoserver.catalog.DimensionPresentation; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.LayerInfo; @@ -82,4 +84,27 @@ private void testNatureJson(DocumentContext json) { assertEquals(180, spatial.read("$[2]"), 0d); assertEquals(90, spatial.read("$[3]"), 0d); } + + @Test + public void testTemporalCollectionHTML() throws Exception { + setupRasterDimension(TIMESERIES, TIME, DimensionPresentation.LIST, null, null, null); + org.jsoup.nodes.Document document = + getAsJSoup("ogc/maps/v1/collections/sf:timeseries?f=html"); + + String id = getLayerId(TIMESERIES).replace(":", "__"); + + // check temporal extent + assertEquals( + "Temporal extent: 2014-01-01T00:00:00Z/2019-01-01T00:00:00Z", + document.select("#" + id + "_temporal").text()); + } + + @Test + public void testCollectionJson() throws Exception { + setupRasterDimension(TIMESERIES, TIME, DimensionPresentation.LIST, null, null, null); + DocumentContext json = getAsJSONPath("ogc/maps/v1/collections/sf:timeseries", 200); + + assertEquals("2014-01-01T00:00:00Z", json.read("$.extent.temporal.interval[0][0]")); + assertEquals("2019-01-01T00:00:00Z", json.read("$.extent.temporal.interval[0][1]")); + } } diff --git a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTest.java b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTest.java new file mode 100644 index 00000000000..5ffc25788ae --- /dev/null +++ b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTest.java @@ -0,0 +1,69 @@ +/* (c) 2023 Open Source Geospatial Foundation - all rights reserved + * This code is licensed under the GPL 2.0 license, available at the root + * application directory. + */ +package org.geoserver.ogcapi.v1.maps; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.jayway.jsonpath.DocumentContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.jsoup.nodes.DataNode; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.junit.Test; + +public class MapsTest extends MapsTestSupport { + @Test + public void testDatetimeJson() throws Exception { + setupStartEndTimeDimension( + TIME_WITH_START_END.getLocalPart(), "time", "startTime", "endTime"); + Integer[] values = {1, 1, 1, 1, 0, 1}; + // work with different time resolutions + String[] dates = { + "2012", + "2012-02", + "2012-02-11", + "2012-02-11T00:00:00Z", + "2012-02-14T00:00:00.000Z", + "2012-02-12T00:00:00Z" + }; + for (int i = 0; i < 6; i++) { + DocumentContext json = + getAsJSONPath( + "ogc/maps/v1/collections/sf:TimeWithStartEnd/styles/Default/map/info?i=50&j=50&f=application%2Fjson&datetime=" + + dates[i], + 200); + assertEquals(values[i], json.read("$.numberReturned", Integer.class)); + } + } + + @Test + public void testDatetimeHTMLMapsFormat() throws Exception { + setupStartEndTimeDimension( + TIME_WITH_START_END.getLocalPart(), "time", "startTime", "endTime"); + Document document = + getAsJSoup( + "ogc/maps/v1/collections/sf:TimeWithStartEnd/styles/Default/map?f=html&datetime=2012-02-12T00:00:00Z"); + Elements scriptsOnPage = document.select("script"); + Matcher matcher = null; + // check that the datetime is in the javascript parameters + String keyToFind = "datetime"; + Pattern pattern = Pattern.compile("\"" + keyToFind + "\":\\s*'(.*?)'"); + boolean found = false; + for (Element element : scriptsOnPage) { + for (DataNode node : element.dataNodes()) { + matcher = pattern.matcher(node.getWholeData()); + while (matcher.find()) { + if (matcher.group().equals("\"datetime\": '2012-02-12T00:00:00Z'")) { + found = true; + } + } + } + } + assertTrue(found); + } +} diff --git a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTestSupport.java b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTestSupport.java index 737232cdee0..a20ba9b1351 100644 --- a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTestSupport.java +++ b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/MapsTestSupport.java @@ -4,10 +4,21 @@ */ package org.geoserver.ogcapi.v1.maps; +import java.util.Collections; +import javax.xml.namespace.QName; +import org.geoserver.catalog.DimensionInfo; +import org.geoserver.catalog.DimensionPresentation; +import org.geoserver.catalog.FeatureTypeInfo; +import org.geoserver.catalog.impl.DimensionInfoImpl; +import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.ogcapi.OGCApiTestSupport; public class MapsTestSupport extends OGCApiTestSupport { + protected static final QName TIMESERIES = + new QName(MockData.SF_URI, "timeseries", MockData.SF_PREFIX); + static final QName TIME_WITH_START_END = + new QName(MockData.SF_URI, "TimeWithStartEnd", MockData.SF_PREFIX); @Override protected void setUpTestData(SystemTestData testData) throws Exception { @@ -18,5 +29,25 @@ protected void setUpTestData(SystemTestData testData) throws Exception { @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); + // add temporal layer + testData.addRasterLayer(TIMESERIES, "timeseries.zip", null, getCatalog()); + testData.addVectorLayer( + TIME_WITH_START_END, + Collections.emptyMap(), + "TimeElevationWithStartEnd.properties", + getClass(), + getCatalog()); + } + + protected void setupStartEndTimeDimension( + String featureTypeName, String dimension, String start, String end) { + FeatureTypeInfo info = getCatalog().getFeatureTypeByName(featureTypeName); + DimensionInfo di = new DimensionInfoImpl(); + di.setEnabled(true); + di.setAttribute(start); + di.setEndAttribute(end); + di.setPresentation(DimensionPresentation.LIST); + info.getMetadata().put(dimension, di); + getCatalog().save(info); } } diff --git a/src/community/ogcapi/ogcapi-maps/src/test/resources/org/geoserver/ogcapi/v1/maps/TimeElevationWithStartEnd.properties b/src/community/ogcapi/ogcapi-maps/src/test/resources/org/geoserver/ogcapi/v1/maps/TimeElevationWithStartEnd.properties new file mode 100644 index 00000000000..37c2f48d8ac --- /dev/null +++ b/src/community/ogcapi/ogcapi-maps/src/test/resources/org/geoserver/ogcapi/v1/maps/TimeElevationWithStartEnd.properties @@ -0,0 +1,4 @@ +_=id:java.lang.Integer,startTime:java.util.Date,endTime:java.util.Date,startElevation:double,endElevation:double,geom:Polygon:srid=4326 +TimeElevationWithStartEnd.0=0|2012-02-11Z|2012-02-12Z|1.0|2.0|POLYGON((-180 90, 0 90, 0 0, -180 0, -180 90)) +TimeElevationWithStartEnd.1=1|2012-02-12Z|2012-02-13Z|2.0|3.0|POLYGON((0 90, 180 90, 180 0, 0 0, 0 90)) +TimeElevationWithStartEnd.2=2|2012-02-11Z|2012-02-14Z|1.0|3.0|POLYGON((-180 -90, 0 -90, 0 0, -180 0, -180 -90)) \ No newline at end of file From 0703477b8987ffe9fcdd50d272be6cbf58a07849 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 12:44:25 +0200 Subject: [PATCH 06/34] Bump org.eclipse.jetty:jetty-servlets in /src (#7117) Bumps [org.eclipse.jetty:jetty-servlets](https://github.com/eclipse/jetty.project) from 9.4.51.v20230217 to 9.4.52.v20230823. - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.51.v20230217...jetty-9.4.52.v20230823) --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-servlets dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pom.xml b/src/pom.xml index 7744ebda615..52968cf3c46 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -97,7 +97,7 @@ 5.5.18 2.5.2.RELEASE 3.1.0 - 9.4.51.v20230217 + 9.4.52.v20230823 3.1.0 4.1.1 7.18.0 From 73b838957c2d729b022ab71067efb2c9f5383970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Mi=C3=B1o?= Date: Mon, 18 Sep 2023 23:43:58 -0700 Subject: [PATCH 07/34] [GEOS-11103] Upgrade Hazelcast dependency to 5.3.1 (#7087) * [GEOS-11103] Upgrade Hazelcast dependency to 5.3.1 * Add hz-cluster community module fixes * Fix QA warning issue on unchecked conversions * Fix build error with missing types --- .../java/org/geoserver/gwc/HazelcastTest.java | 11 ++++++----- .../cluster/hazelcast/EventHzSynchronizer.java | 8 ++++---- .../cluster/hazelcast/HzLockProvider.java | 8 ++++---- .../HzResourceNotificationDispatcher.java | 6 +++--- .../cluster/hazelcast/HzSynchronizer.java | 6 +++--- .../cluster/hazelcast/web/NodeInfoDialog.java | 6 +++--- .../cluster/hazelcast/web/NodeLinkPanel.java | 2 +- .../hazelcast/EventHzSynchronizerSendTest.java | 6 +++--- .../cluster/hazelcast/HzLockProviderTest.java | 13 ++++++++----- .../HzResourceNotificationDispatcherTest.java | 12 +++++++----- .../hazelcast/HzSynchronizerRecvTest.java | 4 ++-- .../cluster/hazelcast/HzSynchronizerTest.java | 16 +++++++++------- .../org/geoserver/wps/hz/FilterToCriteria.java | 2 +- .../org/geoserver/wps/hz/HazelcastLoader.java | 5 +++-- .../geoserver/wps/hz/HazelcastStatusStore.java | 18 +++++++++--------- src/pom.xml | 2 +- 16 files changed, 67 insertions(+), 58 deletions(-) diff --git a/src/community/gwc-distributed/src/test/java/org/geoserver/gwc/HazelcastTest.java b/src/community/gwc-distributed/src/test/java/org/geoserver/gwc/HazelcastTest.java index c2ef0c8dca5..258bcbfc535 100644 --- a/src/community/gwc-distributed/src/test/java/org/geoserver/gwc/HazelcastTest.java +++ b/src/community/gwc-distributed/src/test/java/org/geoserver/gwc/HazelcastTest.java @@ -12,10 +12,10 @@ import static org.junit.Assert.assertTrue; import com.hazelcast.config.Config; +import com.hazelcast.config.EvictionConfig; import com.hazelcast.config.EvictionPolicy; import com.hazelcast.config.MapConfig; -import com.hazelcast.config.MaxSizeConfig; -import com.hazelcast.config.MaxSizeConfig.MaxSizePolicy; +import com.hazelcast.config.MaxSizePolicy; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import java.io.File; @@ -109,9 +109,10 @@ public void testHazelcast() throws Exception { // Configuring hazelcast caching Config config = new Config(); MapConfig mapConfig = new MapConfig(HazelcastCacheProvider.HAZELCAST_MAP_DEFINITION); - MaxSizeConfig maxSizeConf = new MaxSizeConfig(16, MaxSizePolicy.USED_HEAP_SIZE); - mapConfig.setMaxSizeConfig(maxSizeConf); - mapConfig.setEvictionPolicy(EvictionPolicy.LRU); + EvictionConfig evictionConfig = mapConfig.getEvictionConfig(); + evictionConfig.setMaxSizePolicy(MaxSizePolicy.USED_HEAP_SIZE); + evictionConfig.setSize(16); + evictionConfig.setEvictionPolicy(EvictionPolicy.LRU); config.addMapConfig(mapConfig); config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true); diff --git a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/EventHzSynchronizer.java b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/EventHzSynchronizer.java index 26cdb2dc934..618a5ab558f 100644 --- a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/EventHzSynchronizer.java +++ b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/EventHzSynchronizer.java @@ -12,10 +12,10 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; -import com.hazelcast.core.ITopic; -import com.hazelcast.core.Member; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.cluster.Member; +import com.hazelcast.topic.ITopic; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.InetSocketAddress; diff --git a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzLockProvider.java b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzLockProvider.java index 30db5df2305..13a010173a8 100644 --- a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzLockProvider.java +++ b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzLockProvider.java @@ -9,7 +9,7 @@ import com.google.common.base.Preconditions; import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.core.ILock; +import com.hazelcast.cp.lock.FencedLock; import java.util.logging.Level; import java.util.logging.Logger; import org.geoserver.config.LockProviderInitializer; @@ -65,7 +65,7 @@ public Lock acquire(final String path) { "%s - Acquiring distributed lock '%s' (Thread %s)", nodeId(cluster), path, Thread.currentThread().getName())); // } - ILock lock = clusterInstance.getLock(path); + FencedLock lock = clusterInstance.getCPSubsystem().getLock(path); lock.lock(); // if (LOGGER.isLoggable(Level.FINE)) { @@ -80,13 +80,13 @@ public Lock acquire(final String path) { private static class LockAdapter implements Lock { - private ILock lock; + private FencedLock lock; private String path; private HzCluster cluster; - public LockAdapter(ILock lock, String path, HzCluster cluster) { + public LockAdapter(FencedLock lock, String path, HzCluster cluster) { this.lock = lock; this.path = path; this.cluster = cluster; diff --git a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcher.java b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcher.java index 18517601b6f..db361e3256a 100644 --- a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcher.java +++ b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcher.java @@ -4,9 +4,9 @@ */ package org.geoserver.cluster.hazelcast; -import com.hazelcast.core.ITopic; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.topic.ITopic; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; import java.util.logging.Logger; import org.geoserver.platform.resource.ResourceNotification; import org.geoserver.platform.resource.ResourceNotificationDispatcher; diff --git a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzSynchronizer.java b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzSynchronizer.java index 67581fc02b4..96fd8df433a 100644 --- a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzSynchronizer.java +++ b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/HzSynchronizer.java @@ -10,9 +10,9 @@ import com.codahale.metrics.MetricRegistry; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import com.hazelcast.core.ITopic; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.topic.ITopic; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; import java.util.List; import java.util.Queue; import java.util.concurrent.Callable; diff --git a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeInfoDialog.java b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeInfoDialog.java index cd243b561a2..1e90f86dca3 100644 --- a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeInfoDialog.java +++ b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeInfoDialog.java @@ -5,9 +5,9 @@ */ package org.geoserver.cluster.hazelcast.web; -import com.hazelcast.core.Cluster; +import com.hazelcast.cluster.Cluster; +import com.hazelcast.cluster.Member; import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.core.Member; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; @@ -31,7 +31,7 @@ public NodeInfoDialog(String id) { Member m = hz.getCluster().getLocalMember(); InetSocketAddress address = m.getSocketAddress(); - add(new Label("groupName", hz.getConfig().getGroupConfig().getName())); + add(new Label("groupName", hz.getConfig().getClusterName())); add(new Label("ip", address.getAddress().getHostAddress())); add(new Label("host", address.getHostName())); add(new Label("port", String.valueOf(address.getPort()))); diff --git a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeLinkPanel.java b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeLinkPanel.java index ff8728db980..baa83df963d 100644 --- a/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeLinkPanel.java +++ b/src/community/hz-cluster/src/main/java/org/geoserver/cluster/hazelcast/web/NodeLinkPanel.java @@ -47,7 +47,7 @@ protected Component getContents(String id) { } }); - add(new Label("cluster", cluster.getHz().getConfig().getGroupConfig().getName())); + add(new Label("cluster", cluster.getHz().getConfig().getClusterName())); add(dialog = new GeoServerDialog("dialog")); dialog.setInitialHeight(350); diff --git a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/EventHzSynchronizerSendTest.java b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/EventHzSynchronizerSendTest.java index 87259596bbd..42bb16c84fd 100644 --- a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/EventHzSynchronizerSendTest.java +++ b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/EventHzSynchronizerSendTest.java @@ -10,9 +10,9 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; -import com.hazelcast.core.Member; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.cluster.Member; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; import java.util.UUID; import java.util.concurrent.ScheduledExecutorService; import org.easymock.Capture; diff --git a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzLockProviderTest.java b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzLockProviderTest.java index 015e3f4f858..058ccb77942 100644 --- a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzLockProviderTest.java +++ b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzLockProviderTest.java @@ -11,9 +11,10 @@ import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; -import com.hazelcast.core.Cluster; +import com.hazelcast.cluster.Cluster; import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.core.ILock; +import com.hazelcast.cp.CPSubsystem; +import com.hazelcast.cp.lock.FencedLock; import org.geoserver.platform.resource.Resource.Lock; import org.junit.Before; import org.junit.Test; @@ -44,8 +45,10 @@ public void setUp() throws Exception { @Test public void testAqcuire() { - ILock lock = createMock(ILock.class); - expect(this.hz.getLock(eq("path1"))).andReturn(lock); + FencedLock lock = createMock(FencedLock.class); + CPSubsystem cpSubsystem = createMock(CPSubsystem.class); + expect(this.hz.getCPSubsystem()).andReturn(cpSubsystem); + expect(cpSubsystem.getLock(eq("path1"))).andReturn(lock); expect(lock.isLockedByCurrentThread()).andStubReturn(true); lock.lock(); @@ -56,7 +59,7 @@ public void testAqcuire() { lock.unlock(); expectLastCall(); - replay(lock, hz, cluster); + replay(lock, cpSubsystem, hz, cluster); Lock gsLock = lockProvider.acquire("path1"); diff --git a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcherTest.java b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcherTest.java index 7ec4a21867e..78eca0633f2 100644 --- a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcherTest.java +++ b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzResourceNotificationDispatcherTest.java @@ -10,11 +10,12 @@ import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.replay; -import com.hazelcast.core.Cluster; +import com.hazelcast.cluster.Cluster; import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.core.ITopic; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.topic.ITopic; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; +import java.util.UUID; import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.IAnswer; @@ -40,7 +41,8 @@ protected ResourceNotificationDispatcher initWatcher() throws Exception { expect(hz.getCluster()).andStubReturn(cluster); expect(hz.getTopic(HzResourceNotificationDispatcher.TOPIC_NAME)) .andStubReturn(topic); - expect(topic.addMessageListener(capture(captureTopicListener))).andReturn("fake-id"); + expect(topic.addMessageListener(capture(captureTopicListener))) + .andReturn(UUID.randomUUID()); topic.publish(EasyMock.capture(captureTopicPublish)); expectLastCall() .andStubAnswer( diff --git a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerRecvTest.java b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerRecvTest.java index 22bc93bbe7d..0c37553b512 100644 --- a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerRecvTest.java +++ b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerRecvTest.java @@ -8,8 +8,8 @@ import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; import org.easymock.EasyMock; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.FeatureTypeInfo; diff --git a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerTest.java b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerTest.java index 94f73b646b6..80b15d6fe12 100644 --- a/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerTest.java +++ b/src/community/hz-cluster/src/test/java/org/geoserver/cluster/hazelcast/HzSynchronizerTest.java @@ -16,12 +16,12 @@ import static org.hamcrest.Matchers.hasItems; import com.google.common.collect.Sets; -import com.hazelcast.core.Cluster; +import com.hazelcast.cluster.Cluster; +import com.hazelcast.cluster.Member; import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.core.ITopic; -import com.hazelcast.core.Member; -import com.hazelcast.core.Message; -import com.hazelcast.core.MessageListener; +import com.hazelcast.topic.ITopic; +import com.hazelcast.topic.Message; +import com.hazelcast.topic.MessageListener; import java.io.File; import java.io.IOException; import java.net.InetAddress; @@ -110,11 +110,13 @@ public void setUp() throws Exception { expect(this.cluster.getAckTimeoutMillis()).andStubReturn(100); expect(hz.getTopic(TOPIC_NAME)).andStubReturn(topic); - expect(topic.addMessageListener(capture(captureTopicListener))).andReturn("fake-id"); + expect(topic.addMessageListener(capture(captureTopicListener))) + .andReturn(UUID.randomUUID()); expectLastCall().anyTimes(); expect(hz.getTopic(ACK_TOPIC_NAME)).andStubReturn(ackTopic); - expect(ackTopic.addMessageListener(capture(captureAckTopicListener))).andReturn("fake-id"); + expect(ackTopic.addMessageListener(capture(captureAckTopicListener))) + .andReturn(UUID.randomUUID()); expectLastCall().anyTimes(); ackTopic.publish(EasyMock.capture(captureAckTopicPublish)); diff --git a/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/FilterToCriteria.java b/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/FilterToCriteria.java index 42cf11e4280..b00b4ebfb55 100644 --- a/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/FilterToCriteria.java +++ b/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/FilterToCriteria.java @@ -18,7 +18,7 @@ import static com.hazelcast.query.Predicates.or; import com.hazelcast.query.Predicate; -import com.hazelcast.query.TruePredicate; +import com.hazelcast.query.impl.predicates.TruePredicate; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.functors.FalsePredicate; diff --git a/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastLoader.java b/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastLoader.java index ed0953c1c0c..9f8ea414370 100644 --- a/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastLoader.java +++ b/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastLoader.java @@ -88,14 +88,15 @@ private void validateConfiguration(Config config) { // make some sanity checks on the map MapConfig mapConfig = config.getMapConfig(EXECUTION_STATUS_MAP); // Check size policy - if (mapConfig.getMaxSizeConfig().getSize() > 0) { + if (mapConfig.getEvictionConfig().getSize() > 0) { LOGGER.warning( "The WPS status map " + EXECUTION_STATUS_MAP + " has a max size set, it should be unbounded so that no status is lost" + " before the configured timeout"); } - if (mapConfig.getEvictionPolicy() != MapConfig.DEFAULT_EVICTION_POLICY) { + if (mapConfig.getEvictionConfig().getEvictionPolicy() + != MapConfig.DEFAULT_EVICTION_POLICY) { LOGGER.warning( "The WPS status map " + EXECUTION_STATUS_MAP diff --git a/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastStatusStore.java b/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastStatusStore.java index d90d81e5a43..bbd5ec7e9f5 100644 --- a/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastStatusStore.java +++ b/src/extension/wps/wps-cluster-hazelcast/src/main/java/org/geoserver/wps/hz/HazelcastStatusStore.java @@ -6,12 +6,12 @@ import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.HazelcastInstanceAware; -import com.hazelcast.core.IMap; -import com.hazelcast.map.EntryBackupProcessor; import com.hazelcast.map.EntryProcessor; +import com.hazelcast.map.IMap; import com.hazelcast.query.PagingPredicate; import com.hazelcast.query.Predicate; -import com.hazelcast.query.TruePredicate; +import com.hazelcast.query.impl.predicates.PagingPredicateImpl; +import com.hazelcast.query.impl.predicates.TruePredicate; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -124,7 +124,7 @@ public int remove(Filter filter) { } FilterPredicate filterPredicate = new FilterPredicate(filter); - Predicate predicate = filterPredicate.predicate; + Predicate predicate = filterPredicate.predicate; Filter postFilter = filterPredicate.postFilter; Map results = @@ -140,7 +140,7 @@ public List list(Query query) { int startIndex = query.getStartIndex() == null ? 0 : query.getStartIndex(); boolean needsSorting = query.getSortBy() != null && query.getSortBy().length > 0; FilterPredicate filterPredicate = new FilterPredicate(query.getFilter()); - Predicate predicate = filterPredicate.predicate; + Predicate predicate = filterPredicate.predicate; Filter postFilter = filterPredicate.postFilter; // Two cases here: if we have post-filtering we are going to run an entry processor, @@ -162,9 +162,9 @@ public List list(Query query) { pagingComparator = getComparator("value.", query.getSortBy()); } if (pagingComparator != null) { - predicate = new PagingPredicate(predicate, pagingComparator, maxFeatures); + predicate = new PagingPredicateImpl(predicate, pagingComparator, maxFeatures); } else { - predicate = new PagingPredicate(predicate, maxFeatures); + predicate = new PagingPredicateImpl(predicate, maxFeatures); } } @@ -298,7 +298,7 @@ private Predicate toPredicate( * serializable */ private abstract static class AbstractFilteringEntryProcessor - implements EntryProcessor { + implements EntryProcessor { private static final long serialVersionUID = -912785821605141531L; transient Filter filter; @@ -311,7 +311,7 @@ public AbstractFilteringEntryProcessor(Filter filter) { } @Override - public EntryBackupProcessor getBackupProcessor() { + public EntryProcessor getBackupProcessor() { return null; } diff --git a/src/pom.xml b/src/pom.xml index 52968cf3c46..2e7007bae95 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -148,7 +148,7 @@ 7.2.1 3.12.4 0.8.6 - 3.11.1 + 5.3.1 2.7.3 -Xmx${test.maxHeapSize} -enableassertions ${jvm.opts} -Djava.awt.headless=${java.awt.headless} -Dsun.java2d.d3d=${sun.java2d.d3d} -DremoteOwsTests=${remoteOwsTests} -DquietTests=${quietTests} -Dorg.geotools.image.test.enabled=${image.tests} -Dorg.geotools.image.test.interactive=${interactive.image} -Duser.timezone=${user.timezone} -Dwindows.leniency=${windows.leniency} -XX:+TieredCompilation -XX:TieredStopAtLevel=1 apply From 2d69e8175d33aaccf18f0ef93202f8dab47c0883 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Fri, 22 Sep 2023 17:27:18 +0200 Subject: [PATCH 08/34] [GEOS-11131] Update GeoFence to 3.7-RC --- src/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pom.xml b/src/pom.xml index 2e7007bae95..06ce2eab67b 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -123,7 +123,7 @@ true false true - 3.6-SNAPSHOT + 3.7-RC 2.3-SNAPSHOT 1.9.2 3.6.9.Final From 5732eb7a7b5cd2b625d6e5767aaf9573eb52a8c2 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Fri, 22 Sep 2023 16:21:06 +0200 Subject: [PATCH 09/34] Update version numbers for new main --- build/rename.xml | 8 ++++---- doc/en/build.xml | 2 +- doc/en/developer/source/conf.py | 8 ++++---- .../source/programming-guide/ows-services/hello/pom.xml | 4 ++-- doc/en/docguide/source/conf.py | 6 +++--- doc/en/pom.xml | 2 +- doc/en/user/source/conf.py | 6 +++--- doc/zhCN/pom.xml | 2 +- src/community/app-schema/pom.xml | 2 +- src/community/app-schema/webservice-test/pom.xml | 2 +- src/community/backup-restore/core/pom.xml | 2 +- src/community/backup-restore/extension/pom.xml | 2 +- src/community/backup-restore/pom.xml | 2 +- src/community/backup-restore/rest/pom.xml | 2 +- src/community/backup-restore/web/pom.xml | 2 +- src/community/cog/pom.xml | 2 +- src/community/colormap/pom.xml | 2 +- src/community/cov-json/pom.xml | 2 +- src/community/datadir-catalog-loader/pom.xml | 2 +- src/community/dds/pom.xml | 2 +- src/community/dyndimension/pom.xml | 2 +- src/community/elasticsearch/pom.xml | 2 +- .../features-templating/features-templating-core/pom.xml | 2 +- .../features-templating-ogcapi/pom.xml | 2 +- .../features-templating/features-templating-ows/pom.xml | 2 +- .../features-templating/features-templating-rest/pom.xml | 2 +- .../features-templating/features-templating-web/pom.xml | 2 +- src/community/features-templating/pom.xml | 2 +- src/community/flatgeobuf/pom.xml | 2 +- src/community/gdal/gdal-wcs/pom.xml | 2 +- src/community/gdal/gdal-wps/pom.xml | 2 +- src/community/gdal/pom.xml | 2 +- src/community/geomesa/pom.xml | 2 +- src/community/geopkg/pom.xml | 2 +- src/community/gpxppio/pom.xml | 2 +- src/community/gsr/pom.xml | 2 +- src/community/gwc-azure-blob/pom.xml | 2 +- src/community/gwc-distributed/pom.xml | 2 +- src/community/gwc-mbtiles/pom.xml | 2 +- src/community/gwc-sqlite/pom.xml | 2 +- src/community/hello/pom.xml | 2 +- src/community/hello_web/pom.xml | 2 +- src/community/hz-cluster/pom.xml | 2 +- src/community/imagemap/pom.xml | 2 +- src/community/importer-jdbc/pom.xml | 2 +- src/community/jdbc-metrics/pom.xml | 2 +- src/community/jdbcconfig/pom.xml | 2 +- src/community/jdbcstore/pom.xml | 2 +- src/community/jms-cluster/activemqBroker/pom.xml | 2 +- src/community/jms-cluster/jms-commons/pom.xml | 2 +- src/community/jms-cluster/jms-geoserver/pom.xml | 2 +- src/community/jms-cluster/pom.xml | 2 +- src/community/libdeflate/pom.xml | 2 +- src/community/mbtiles/pom.xml | 2 +- src/community/monitor-hibernate/pom.xml | 2 +- src/community/ncwms/pom.xml | 2 +- src/community/netcdf-ghrsst/pom.xml | 2 +- src/community/notification-common/pom.xml | 2 +- src/community/notification-geonode/pom.xml | 2 +- src/community/notification/pom.xml | 2 +- src/community/nsg-profiles/pom.xml | 2 +- src/community/ogcapi/dggs/dggs-clickhouse/pom.xml | 2 +- src/community/ogcapi/dggs/dggs-core/pom.xml | 2 +- src/community/ogcapi/dggs/ogcapi-dggs/pom.xml | 2 +- src/community/ogcapi/dggs/pom.xml | 2 +- src/community/ogcapi/dggs/web-dggs/pom.xml | 2 +- src/community/ogcapi/ogcapi-changeset/pom.xml | 2 +- src/community/ogcapi/ogcapi-core/pom.xml | 2 +- src/community/ogcapi/ogcapi-coverages/pom.xml | 2 +- src/community/ogcapi/ogcapi-features/pom.xml | 2 +- src/community/ogcapi/ogcapi-images/pom.xml | 2 +- src/community/ogcapi/ogcapi-maps/pom.xml | 2 +- src/community/ogcapi/ogcapi-styles/pom.xml | 2 +- src/community/ogcapi/ogcapi-tiled-features/pom.xml | 2 +- src/community/ogcapi/ogcapi-tiles/pom.xml | 2 +- src/community/ogcapi/pom.xml | 2 +- src/community/ogcapi/web-ogcapi/pom.xml | 2 +- src/community/oseo/oseo-core/pom.xml | 2 +- src/community/oseo/oseo-integration-tests/pom.xml | 2 +- src/community/oseo/oseo-rest/pom.xml | 2 +- src/community/oseo/oseo-service/pom.xml | 2 +- src/community/oseo/oseo-stac/pom.xml | 2 +- src/community/oseo/pom.xml | 2 +- src/community/oseo/web-oseo/pom.xml | 2 +- src/community/pgraster/pom.xml | 2 +- src/community/pom.xml | 2 +- src/community/programming-guide/pom.xml | 2 +- src/community/proxy-base-ext/pom.xml | 2 +- src/community/release/pom.xml | 2 +- src/community/rest-ext/pom.xml | 4 ++-- src/community/rest-openapi/generated/feign-client/pom.xml | 2 +- src/community/rest-openapi/generated/model/pom.xml | 2 +- src/community/rest-openapi/generated/pom.xml | 2 +- src/community/rest-openapi/java-client/pom.xml | 2 +- src/community/rest-openapi/model-mapping/pom.xml | 2 +- src/community/rest-openapi/openapi/pom.xml | 2 +- src/community/rest-openapi/pom.xml | 2 +- src/community/rest-upload/pom.xml | 4 ++-- src/community/s3-geotiff/pom.xml | 2 +- .../schemaless-features/mongodb-schemaless/pom.xml | 2 +- src/community/schemaless-features/pom.xml | 2 +- src/community/schemaless-features/schemaless-core/pom.xml | 2 +- src/community/security/keycloak/pom.xml | 2 +- src/community/security/oauth2-geonode/pom.xml | 2 +- src/community/security/oauth2-github/pom.xml | 2 +- src/community/security/oauth2-google/pom.xml | 2 +- .../oauth2-openid-connect-core/pom.xml | 2 +- .../oauth2-openid-connect-web/pom.xml | 2 +- src/community/security/oauth2-openid-connect/pom.xml | 2 +- src/community/security/oauth2/oauth2-core/pom.xml | 2 +- src/community/security/oauth2/oauth2-web/pom.xml | 2 +- src/community/security/oauth2/pom.xml | 2 +- src/community/security/pom.xml | 2 +- src/community/smart-data-loader/pom.xml | 2 +- src/community/solr/pom.xml | 2 +- src/community/spatialjson/pom.xml | 2 +- src/community/taskmanager/core/pom.xml | 2 +- src/community/taskmanager/metadata/pom.xml | 4 ++-- src/community/taskmanager/pom.xml | 2 +- src/community/taskmanager/s3/pom.xml | 2 +- src/community/vector-mosaic/pom.xml | 2 +- src/community/vsi/pom.xml | 2 +- src/community/web-ogr/pom.xml | 2 +- src/community/web-service-auth/pom.xml | 4 ++-- src/community/webp/pom.xml | 2 +- src/community/wps-longitudinal-profile/pom.xml | 2 +- src/community/wps-remote/pom.xml | 2 +- src/community/wps-sextante/pom.xml | 2 +- src/community/xslt/pom.xml | 2 +- src/extension/app-schema/app-schema-core/pom.xml | 2 +- src/extension/app-schema/app-schema-geopkg-test/pom.xml | 2 +- src/extension/app-schema/app-schema-indexes-test/pom.xml | 2 +- src/extension/app-schema/app-schema-mongo-test/pom.xml | 2 +- src/extension/app-schema/app-schema-oracle-test/pom.xml | 2 +- src/extension/app-schema/app-schema-postgis-test/pom.xml | 2 +- src/extension/app-schema/app-schema-solr-test/pom.xml | 2 +- src/extension/app-schema/app-schema-test/pom.xml | 2 +- src/extension/app-schema/pom.xml | 2 +- src/extension/app-schema/sample-data-access-test/pom.xml | 2 +- src/extension/authkey/pom.xml | 2 +- src/extension/charts/pom.xml | 2 +- src/extension/control-flow/pom.xml | 2 +- src/extension/css/pom.xml | 2 +- src/extension/csw/api/pom.xml | 2 +- src/extension/csw/core/pom.xml | 2 +- src/extension/csw/csw-iso/pom.xml | 2 +- src/extension/csw/pom.xml | 2 +- src/extension/csw/simple-store/pom.xml | 2 +- src/extension/csw/web-csw/pom.xml | 2 +- src/extension/db2/pom.xml | 2 +- src/extension/dxf/core/pom.xml | 2 +- src/extension/dxf/pom.xml | 2 +- src/extension/dxf/wps/pom.xml | 2 +- src/extension/excel/pom.xml | 2 +- src/extension/feature-pregeneralized/pom.xml | 2 +- src/extension/gdal/pom.xml | 2 +- src/extension/geofence/geofence-server/pom.xml | 2 +- src/extension/geofence/geofence-wps/pom.xml | 2 +- src/extension/geofence/geofence/pom.xml | 2 +- src/extension/geofence/pom.xml | 2 +- src/extension/geopkg-output/pom.xml | 2 +- src/extension/grib/pom.xml | 2 +- src/extension/gwc-s3/pom.xml | 2 +- src/extension/h2/pom.xml | 2 +- src/extension/importer/core/pom.xml | 2 +- src/extension/importer/pom.xml | 2 +- src/extension/importer/rest/pom.xml | 2 +- src/extension/importer/web/pom.xml | 2 +- src/extension/inspire/pom.xml | 2 +- src/extension/jp2k/pom.xml | 2 +- src/extension/libjpeg-turbo/pom.xml | 2 +- src/extension/mapml/pom.xml | 2 +- src/extension/mbstyle/pom.xml | 2 +- src/extension/metadata/pom.xml | 2 +- src/extension/mongodb/pom.xml | 2 +- src/extension/monitor/core/pom.xml | 2 +- src/extension/monitor/pom.xml | 2 +- src/extension/mysql/pom.xml | 2 +- src/extension/netcdf-out/pom.xml | 2 +- src/extension/netcdf/pom.xml | 2 +- src/extension/ogr/ogr-core/pom.xml | 2 +- src/extension/ogr/ogr-wfs/pom.xml | 2 +- src/extension/ogr/ogr-wps/pom.xml | 2 +- src/extension/ogr/pom.xml | 2 +- src/extension/oracle/pom.xml | 2 +- src/extension/params-extractor/pom.xml | 2 +- src/extension/pom.xml | 2 +- src/extension/printing/pom.xml | 2 +- src/extension/querylayer/pom.xml | 2 +- src/extension/security/cas/pom.xml | 2 +- src/extension/security/pom.xml | 2 +- src/extension/security/web/pom.xml | 2 +- src/extension/security/web/web-cas/pom.xml | 2 +- src/extension/sldService/pom.xml | 2 +- src/extension/sqlserver/pom.xml | 2 +- src/extension/vectortiles/pom.xml | 2 +- src/extension/wcs2_0-eo/core/pom.xml | 2 +- src/extension/wcs2_0-eo/pom.xml | 2 +- src/extension/wcs2_0-eo/web/pom.xml | 2 +- src/extension/web-resource/pom.xml | 2 +- src/extension/wmts-multi-dimensional/pom.xml | 2 +- src/extension/wps-download/pom.xml | 2 +- src/extension/wps-jdbc/pom.xml | 2 +- src/extension/wps/pom.xml | 2 +- src/extension/wps/web-wps/pom.xml | 2 +- src/extension/wps/wps-cluster-hazelcast/pom.xml | 2 +- src/extension/wps/wps-core/pom.xml | 2 +- src/extension/wps/wps-kml-ppio/pom.xml | 2 +- src/extension/ysld/pom.xml | 2 +- src/gwc-rest/pom.xml | 2 +- src/gwc/pom.xml | 2 +- src/kml/pom.xml | 2 +- src/main/pom.xml | 2 +- src/maven/archetype/pom.xml | 2 +- src/maven/archetype/webPlugin/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 6 +++--- src/maven/archetype/wfsOutputFormat/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 6 +++--- src/maven/config/pom.xml | 2 +- src/maven/pom.xml | 2 +- src/ows/pom.xml | 2 +- src/platform/pom.xml | 2 +- src/pom.xml | 8 ++++---- src/release/installer/mac/console/pom.xml | 2 +- src/release/pom.xml | 2 +- src/rest/pom.xml | 2 +- src/restconfig-wcs/pom.xml | 2 +- src/restconfig-wfs/pom.xml | 2 +- src/restconfig-wms/pom.xml | 2 +- src/restconfig-wmts/pom.xml | 2 +- src/restconfig/pom.xml | 2 +- src/security/jdbc/pom.xml | 2 +- src/security/ldap/pom.xml | 2 +- src/security/pom.xml | 2 +- src/security/security-tests/pom.xml | 2 +- src/wcs/pom.xml | 2 +- src/wcs1_0/pom.xml | 2 +- src/wcs1_1/pom.xml | 2 +- src/wcs2_0/pom.xml | 2 +- src/web/app/pom.xml | 2 +- src/web/core/pom.xml | 2 +- src/web/demo/pom.xml | 2 +- src/web/gwc/pom.xml | 2 +- src/web/pom.xml | 2 +- src/web/rest/pom.xml | 2 +- src/web/security/core/pom.xml | 2 +- src/web/security/jdbc/pom.xml | 2 +- src/web/security/ldap/pom.xml | 2 +- src/web/security/pom.xml | 2 +- src/web/wcs/pom.xml | 2 +- src/web/wfs/pom.xml | 2 +- src/web/wms/pom.xml | 2 +- src/wfs/pom.xml | 2 +- src/wms/pom.xml | 2 +- 254 files changed, 276 insertions(+), 276 deletions(-) diff --git a/build/rename.xml b/build/rename.xml index 89f60fc61fb..63f9881f9f6 100644 --- a/build/rename.xml +++ b/build/rename.xml @@ -6,8 +6,8 @@ ant -f release.xml -Dcurrent=2.17 -Drelease=2.18 --> - - + + current: ${current} @@ -32,8 +32,8 @@ - - + + diff --git a/doc/en/build.xml b/doc/en/build.xml index 9007e0dc097..b16b805aefc 100644 --- a/doc/en/build.xml +++ b/doc/en/build.xml @@ -37,7 +37,7 @@ - + diff --git a/doc/en/developer/source/conf.py b/doc/en/developer/source/conf.py index 619beabc1e5..e03e87d9a77 100644 --- a/doc/en/developer/source/conf.py +++ b/doc/en/developer/source/conf.py @@ -48,17 +48,17 @@ # other places throughout the built documents. # # The short X.Y version. -version = '2.24' +version = '2.25' # The full version, including alpha/beta/rc tags. -release = '2.24-SNAPSHOT' +release = '2.25-SNAPSHOT' # Used in build and documentation links -branch = '2.24.x' +branch = '2.25.x' # Users don't need to see the "SNAPSHOT" notation when it's there if release.find('SNAPSHOT') != -1: - release = '2.24.x' + release = '2.25.x' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff --git a/doc/en/developer/source/programming-guide/ows-services/hello/pom.xml b/doc/en/developer/source/programming-guide/ows-services/hello/pom.xml index fa0076c7d72..20045dd52d4 100644 --- a/doc/en/developer/source/programming-guide/ows-services/hello/pom.xml +++ b/doc/en/developer/source/programming-guide/ows-services/hello/pom.xml @@ -8,7 +8,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver @@ -22,7 +22,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma org.geoserver gs-main - 2.24-SNAPSHOT + 2.25-SNAPSHOT diff --git a/doc/en/docguide/source/conf.py b/doc/en/docguide/source/conf.py index e77f6fd98cf..712621e3b21 100644 --- a/doc/en/docguide/source/conf.py +++ b/doc/en/docguide/source/conf.py @@ -48,12 +48,12 @@ # other places throughout the built documents. # # The short X.Y version. -version = '2.24' +version = '2.25' # The full version, including alpha/beta/rc tags. -release = '2.24-SNAPSHOT' +release = '2.25-SNAPSHOT' # Users don't need to see the "SNAPSHOT" notation when it's there if release.find('SNAPSHOT') != -1: - release = '2.24.x' + release = '2.25.x' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff --git a/doc/en/pom.xml b/doc/en/pom.xml index 59be3a872b6..2abc5a4b89b 100644 --- a/doc/en/pom.xml +++ b/doc/en/pom.xml @@ -4,7 +4,7 @@ 4.0.0 gs-docs org.geoserver.en - 2.24-SNAPSHOT + 2.25-SNAPSHOT pom GeoServer English Documentation GeoServer English documentation diff --git a/doc/en/user/source/conf.py b/doc/en/user/source/conf.py index 824225550fb..7f0aa7c46cf 100644 --- a/doc/en/user/source/conf.py +++ b/doc/en/user/source/conf.py @@ -48,7 +48,7 @@ # other places throughout the built documents. # # The replacement |version| provides short X.Y version. -version = '2.24' +version = '2.25' # The relacement |release| provides the full version, including alpha/beta/rc tags. @@ -58,7 +58,7 @@ # check environmental variable to see if ant build.xml passed in project.version project_version = os.getenv("project.version") if project_version == None: - release = '2.24-SNAPSHOT' + release = '2.25-SNAPSHOT' else: release = project_version @@ -70,7 +70,7 @@ if release.find('SNAPSHOT') != -1: tags.add('snapshot') download = version+'.x' - release = '2.24.x' + release = '2.25.x' latest = '-latest' download_release = 'https://build.geoserver.org/geoserver/'+branch+'/geoserver-'+version+'.x-latest-%s.zip' download_extension = 'https://build.geoserver.org/geoserver/'+branch+'/ext-latest/geoserver-'+version+'-SNAPSHOT-%s-plugin.zip' diff --git a/doc/zhCN/pom.xml b/doc/zhCN/pom.xml index 8774ab2f166..5a59df84db2 100644 --- a/doc/zhCN/pom.xml +++ b/doc/zhCN/pom.xml @@ -4,7 +4,7 @@ 4.0.0 gs-docs org.geoserver.en - 2.24-SNAPSHOT + 2.25-SNAPSHOT pom GeoServer Chinese Simplified Documentation GeoServer Chinese Simplified documentation diff --git a/src/community/app-schema/pom.xml b/src/community/app-schema/pom.xml index db1387f9e35..ecab8907f6c 100644 --- a/src/community/app-schema/pom.xml +++ b/src/community/app-schema/pom.xml @@ -12,7 +12,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/app-schema/webservice-test/pom.xml b/src/community/app-schema/webservice-test/pom.xml index d181d2024ff..91470b6d916 100644 --- a/src/community/app-schema/webservice-test/pom.xml +++ b/src/community/app-schema/webservice-test/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-app-schema-community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/backup-restore/core/pom.xml b/src/community/backup-restore/core/pom.xml index bdc487d2613..81b27586aff 100644 --- a/src/community/backup-restore/core/pom.xml +++ b/src/community/backup-restore/core/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-backup-restore - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community.backuprestore diff --git a/src/community/backup-restore/extension/pom.xml b/src/community/backup-restore/extension/pom.xml index e7ab7ea2abb..571f4abd864 100644 --- a/src/community/backup-restore/extension/pom.xml +++ b/src/community/backup-restore/extension/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-backup-restore - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community.backuprestore diff --git a/src/community/backup-restore/pom.xml b/src/community/backup-restore/pom.xml index 6a71e464463..b2ba9a833d5 100644 --- a/src/community/backup-restore/pom.xml +++ b/src/community/backup-restore/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/backup-restore/rest/pom.xml b/src/community/backup-restore/rest/pom.xml index d8a4bce0ec0..a9d5f4aef9d 100644 --- a/src/community/backup-restore/rest/pom.xml +++ b/src/community/backup-restore/rest/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-backup-restore - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community.backuprestore diff --git a/src/community/backup-restore/web/pom.xml b/src/community/backup-restore/web/pom.xml index f7785522b78..8f9c5c2bd4f 100644 --- a/src/community/backup-restore/web/pom.xml +++ b/src/community/backup-restore/web/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-backup-restore - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community.backuprestore diff --git a/src/community/cog/pom.xml b/src/community/cog/pom.xml index 61769fbd0a2..3f45b1d262b 100644 --- a/src/community/cog/pom.xml +++ b/src/community/cog/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/colormap/pom.xml b/src/community/colormap/pom.xml index 1ca10f04765..ebbf5eeb110 100644 --- a/src/community/colormap/pom.xml +++ b/src/community/colormap/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/cov-json/pom.xml b/src/community/cov-json/pom.xml index ac3b742776b..8626d606b72 100644 --- a/src/community/cov-json/pom.xml +++ b/src/community/cov-json/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/datadir-catalog-loader/pom.xml b/src/community/datadir-catalog-loader/pom.xml index 49aea327e18..8bb8334b8fc 100644 --- a/src/community/datadir-catalog-loader/pom.xml +++ b/src/community/datadir-catalog-loader/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/dds/pom.xml b/src/community/dds/pom.xml index 98c305ab2bb..2c1dff3457e 100644 --- a/src/community/dds/pom.xml +++ b/src/community/dds/pom.xml @@ -12,7 +12,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/dyndimension/pom.xml b/src/community/dyndimension/pom.xml index 79bed69d351..11292a4ae71 100644 --- a/src/community/dyndimension/pom.xml +++ b/src/community/dyndimension/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/elasticsearch/pom.xml b/src/community/elasticsearch/pom.xml index c201c225f79..eb6ea1fb1d4 100644 --- a/src/community/elasticsearch/pom.xml +++ b/src/community/elasticsearch/pom.xml @@ -8,7 +8,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/features-templating/features-templating-core/pom.xml b/src/community/features-templating/features-templating-core/pom.xml index 0f2e2a3a49a..334464c46d7 100644 --- a/src/community/features-templating/features-templating-core/pom.xml +++ b/src/community/features-templating/features-templating-core/pom.xml @@ -5,7 +5,7 @@ org.geoserver.community gs-features-templating - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/features-templating/features-templating-ogcapi/pom.xml b/src/community/features-templating/features-templating-ogcapi/pom.xml index 05e9175f398..8b042189c41 100644 --- a/src/community/features-templating/features-templating-ogcapi/pom.xml +++ b/src/community/features-templating/features-templating-ogcapi/pom.xml @@ -5,7 +5,7 @@ org.geoserver.community gs-features-templating - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/features-templating/features-templating-ows/pom.xml b/src/community/features-templating/features-templating-ows/pom.xml index 954bafa4ce9..49b97288781 100644 --- a/src/community/features-templating/features-templating-ows/pom.xml +++ b/src/community/features-templating/features-templating-ows/pom.xml @@ -5,7 +5,7 @@ org.geoserver.community gs-features-templating - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/features-templating/features-templating-rest/pom.xml b/src/community/features-templating/features-templating-rest/pom.xml index 650307c316f..63526b220bb 100644 --- a/src/community/features-templating/features-templating-rest/pom.xml +++ b/src/community/features-templating/features-templating-rest/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-features-templating - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/features-templating/features-templating-web/pom.xml b/src/community/features-templating/features-templating-web/pom.xml index 0025e05b935..113b2112532 100644 --- a/src/community/features-templating/features-templating-web/pom.xml +++ b/src/community/features-templating/features-templating-web/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-features-templating - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/features-templating/pom.xml b/src/community/features-templating/pom.xml index dbfddb96547..84d76c0aefc 100644 --- a/src/community/features-templating/pom.xml +++ b/src/community/features-templating/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/flatgeobuf/pom.xml b/src/community/flatgeobuf/pom.xml index d39e42ebf4e..41a25c9a094 100644 --- a/src/community/flatgeobuf/pom.xml +++ b/src/community/flatgeobuf/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/gdal/gdal-wcs/pom.xml b/src/community/gdal/gdal-wcs/pom.xml index 240456b4a92..3959450707b 100644 --- a/src/community/gdal/gdal-wcs/pom.xml +++ b/src/community/gdal/gdal-wcs/pom.xml @@ -8,7 +8,7 @@ org.geoserver.community gs-gdal - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/gdal/gdal-wps/pom.xml b/src/community/gdal/gdal-wps/pom.xml index ff82a47dcb0..36fd7b9bc78 100644 --- a/src/community/gdal/gdal-wps/pom.xml +++ b/src/community/gdal/gdal-wps/pom.xml @@ -8,7 +8,7 @@ org.geoserver.community gs-gdal - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/gdal/pom.xml b/src/community/gdal/pom.xml index 30adf15d2bd..0d87e95f5bf 100644 --- a/src/community/gdal/pom.xml +++ b/src/community/gdal/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/geomesa/pom.xml b/src/community/geomesa/pom.xml index 7c5c5f9e6c1..ef2ba314033 100644 --- a/src/community/geomesa/pom.xml +++ b/src/community/geomesa/pom.xml @@ -12,7 +12,7 @@ application directory. org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/geopkg/pom.xml b/src/community/geopkg/pom.xml index 7bafdd5b212..db8cf39113c 100644 --- a/src/community/geopkg/pom.xml +++ b/src/community/geopkg/pom.xml @@ -9,7 +9,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-geopkg diff --git a/src/community/gpxppio/pom.xml b/src/community/gpxppio/pom.xml index be9ae9c3943..7737b730013 100644 --- a/src/community/gpxppio/pom.xml +++ b/src/community/gpxppio/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-gpxppio diff --git a/src/community/gsr/pom.xml b/src/community/gsr/pom.xml index 8408541a76b..62c90dccb1f 100644 --- a/src/community/gsr/pom.xml +++ b/src/community/gsr/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/gwc-azure-blob/pom.xml b/src/community/gwc-azure-blob/pom.xml index 49ca046cf1c..c4f503858de 100644 --- a/src/community/gwc-azure-blob/pom.xml +++ b/src/community/gwc-azure-blob/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/gwc-distributed/pom.xml b/src/community/gwc-distributed/pom.xml index 92db51073ca..af93ebed90a 100644 --- a/src/community/gwc-distributed/pom.xml +++ b/src/community/gwc-distributed/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-gwc-distributed diff --git a/src/community/gwc-mbtiles/pom.xml b/src/community/gwc-mbtiles/pom.xml index 81ee09c1ea7..b00557edeea 100644 --- a/src/community/gwc-mbtiles/pom.xml +++ b/src/community/gwc-mbtiles/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/gwc-sqlite/pom.xml b/src/community/gwc-sqlite/pom.xml index c9d8f4c607e..9063d26dcbb 100644 --- a/src/community/gwc-sqlite/pom.xml +++ b/src/community/gwc-sqlite/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-gwc-sqlite diff --git a/src/community/hello/pom.xml b/src/community/hello/pom.xml index a5ad7af1290..485f41ea088 100644 --- a/src/community/hello/pom.xml +++ b/src/community/hello/pom.xml @@ -12,7 +12,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/community/hello_web/pom.xml b/src/community/hello_web/pom.xml index 3f8656bb05c..6de7797df94 100644 --- a/src/community/hello_web/pom.xml +++ b/src/community/hello_web/pom.xml @@ -6,7 +6,7 @@ org.geoserver gs-web2 - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/community/hz-cluster/pom.xml b/src/community/hz-cluster/pom.xml index cbd9398f82a..9dae706e0a5 100644 --- a/src/community/hz-cluster/pom.xml +++ b/src/community/hz-cluster/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/imagemap/pom.xml b/src/community/imagemap/pom.xml index 1036673b1ac..cdc6e265c3c 100644 --- a/src/community/imagemap/pom.xml +++ b/src/community/imagemap/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/community/importer-jdbc/pom.xml b/src/community/importer-jdbc/pom.xml index c185225c257..d7e7506a850 100644 --- a/src/community/importer-jdbc/pom.xml +++ b/src/community/importer-jdbc/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-importer-jdbc diff --git a/src/community/jdbc-metrics/pom.xml b/src/community/jdbc-metrics/pom.xml index 3cd863505e1..16b07056b6e 100644 --- a/src/community/jdbc-metrics/pom.xml +++ b/src/community/jdbc-metrics/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/jdbcconfig/pom.xml b/src/community/jdbcconfig/pom.xml index 4958b9381d0..ebe71eee4fd 100644 --- a/src/community/jdbcconfig/pom.xml +++ b/src/community/jdbcconfig/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-jdbcconfig diff --git a/src/community/jdbcstore/pom.xml b/src/community/jdbcstore/pom.xml index 1dcd3bfd108..3b832b0f2d2 100644 --- a/src/community/jdbcstore/pom.xml +++ b/src/community/jdbcstore/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-jdbcstore diff --git a/src/community/jms-cluster/activemqBroker/pom.xml b/src/community/jms-cluster/activemqBroker/pom.xml index 577aa2e69e6..3479fd03014 100644 --- a/src/community/jms-cluster/activemqBroker/pom.xml +++ b/src/community/jms-cluster/activemqBroker/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-jms-cluster-container - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/jms-cluster/jms-commons/pom.xml b/src/community/jms-cluster/jms-commons/pom.xml index 0bec303f1f4..31baadad9d7 100644 --- a/src/community/jms-cluster/jms-commons/pom.xml +++ b/src/community/jms-cluster/jms-commons/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-jms-cluster-container - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/jms-cluster/jms-geoserver/pom.xml b/src/community/jms-cluster/jms-geoserver/pom.xml index b4b49415fe2..7230df404a5 100644 --- a/src/community/jms-cluster/jms-geoserver/pom.xml +++ b/src/community/jms-cluster/jms-geoserver/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-jms-cluster-container - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/jms-cluster/pom.xml b/src/community/jms-cluster/pom.xml index 8cadbfe9fbe..aff166c0705 100644 --- a/src/community/jms-cluster/pom.xml +++ b/src/community/jms-cluster/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/libdeflate/pom.xml b/src/community/libdeflate/pom.xml index 029169a4c46..964d0eaac60 100644 --- a/src/community/libdeflate/pom.xml +++ b/src/community/libdeflate/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/mbtiles/pom.xml b/src/community/mbtiles/pom.xml index fe49298ad4d..bb5c4a10bf8 100644 --- a/src/community/mbtiles/pom.xml +++ b/src/community/mbtiles/pom.xml @@ -9,7 +9,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-mbtiles diff --git a/src/community/monitor-hibernate/pom.xml b/src/community/monitor-hibernate/pom.xml index 675d8698fd6..84d7804ed50 100644 --- a/src/community/monitor-hibernate/pom.xml +++ b/src/community/monitor-hibernate/pom.xml @@ -8,7 +8,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-monitor-hibernate diff --git a/src/community/ncwms/pom.xml b/src/community/ncwms/pom.xml index d24128036ff..e7168c113e1 100644 --- a/src/community/ncwms/pom.xml +++ b/src/community/ncwms/pom.xml @@ -8,7 +8,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/netcdf-ghrsst/pom.xml b/src/community/netcdf-ghrsst/pom.xml index efc3aac36c9..9968cfe204a 100644 --- a/src/community/netcdf-ghrsst/pom.xml +++ b/src/community/netcdf-ghrsst/pom.xml @@ -8,7 +8,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/notification-common/pom.xml b/src/community/notification-common/pom.xml index 2f92b40b7c8..32d0ae31cea 100644 --- a/src/community/notification-common/pom.xml +++ b/src/community/notification-common/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-notification-common diff --git a/src/community/notification-geonode/pom.xml b/src/community/notification-geonode/pom.xml index 55d29792b7b..033771958df 100644 --- a/src/community/notification-geonode/pom.xml +++ b/src/community/notification-geonode/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-notification-geonode diff --git a/src/community/notification/pom.xml b/src/community/notification/pom.xml index ee7c96933ef..08386ea1243 100644 --- a/src/community/notification/pom.xml +++ b/src/community/notification/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/nsg-profiles/pom.xml b/src/community/nsg-profiles/pom.xml index ba5ed4118bf..2b9dac453cc 100644 --- a/src/community/nsg-profiles/pom.xml +++ b/src/community/nsg-profiles/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-nsg-profiles diff --git a/src/community/ogcapi/dggs/dggs-clickhouse/pom.xml b/src/community/ogcapi/dggs/dggs-clickhouse/pom.xml index ed768571ace..be247fc7c92 100644 --- a/src/community/ogcapi/dggs/dggs-clickhouse/pom.xml +++ b/src/community/ogcapi/dggs/dggs-clickhouse/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-dggs - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/dggs/dggs-core/pom.xml b/src/community/ogcapi/dggs/dggs-core/pom.xml index c366ebc21c3..6f25c5433eb 100644 --- a/src/community/ogcapi/dggs/dggs-core/pom.xml +++ b/src/community/ogcapi/dggs/dggs-core/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-dggs - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml b/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml index f099fbc3eb7..37940eb3145 100644 --- a/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml +++ b/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-dggs - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/dggs/pom.xml b/src/community/ogcapi/dggs/pom.xml index 6bcc550b7a7..6514197e59b 100644 --- a/src/community/ogcapi/dggs/pom.xml +++ b/src/community/ogcapi/dggs/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/dggs/web-dggs/pom.xml b/src/community/ogcapi/dggs/web-dggs/pom.xml index 846c4cda61a..535da47e7e1 100644 --- a/src/community/ogcapi/dggs/web-dggs/pom.xml +++ b/src/community/ogcapi/dggs/web-dggs/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-dggs - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-changeset/pom.xml b/src/community/ogcapi/ogcapi-changeset/pom.xml index 7273f563c81..cec279e01d2 100644 --- a/src/community/ogcapi/ogcapi-changeset/pom.xml +++ b/src/community/ogcapi/ogcapi-changeset/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-core/pom.xml b/src/community/ogcapi/ogcapi-core/pom.xml index f115da86e12..44b37c22421 100644 --- a/src/community/ogcapi/ogcapi-core/pom.xml +++ b/src/community/ogcapi/ogcapi-core/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-coverages/pom.xml b/src/community/ogcapi/ogcapi-coverages/pom.xml index 51d8261f2ae..068bfb8a5cd 100644 --- a/src/community/ogcapi/ogcapi-coverages/pom.xml +++ b/src/community/ogcapi/ogcapi-coverages/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-features/pom.xml b/src/community/ogcapi/ogcapi-features/pom.xml index 0822b895266..4eb0b8f6db4 100644 --- a/src/community/ogcapi/ogcapi-features/pom.xml +++ b/src/community/ogcapi/ogcapi-features/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-images/pom.xml b/src/community/ogcapi/ogcapi-images/pom.xml index 557e4a4e53c..dcba007753f 100644 --- a/src/community/ogcapi/ogcapi-images/pom.xml +++ b/src/community/ogcapi/ogcapi-images/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-maps/pom.xml b/src/community/ogcapi/ogcapi-maps/pom.xml index e51713627bc..5d4a70abe81 100644 --- a/src/community/ogcapi/ogcapi-maps/pom.xml +++ b/src/community/ogcapi/ogcapi-maps/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-styles/pom.xml b/src/community/ogcapi/ogcapi-styles/pom.xml index 3f12c7d2273..1c30c5a2a66 100644 --- a/src/community/ogcapi/ogcapi-styles/pom.xml +++ b/src/community/ogcapi/ogcapi-styles/pom.xml @@ -10,7 +10,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-tiled-features/pom.xml b/src/community/ogcapi/ogcapi-tiled-features/pom.xml index 30acb660417..c502de49066 100644 --- a/src/community/ogcapi/ogcapi-tiled-features/pom.xml +++ b/src/community/ogcapi/ogcapi-tiled-features/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/ogcapi-tiles/pom.xml b/src/community/ogcapi/ogcapi-tiles/pom.xml index ae336e575dc..6ee07722d04 100644 --- a/src/community/ogcapi/ogcapi-tiles/pom.xml +++ b/src/community/ogcapi/ogcapi-tiles/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/pom.xml b/src/community/ogcapi/pom.xml index 536b3f2a093..0b011a11997 100644 --- a/src/community/ogcapi/pom.xml +++ b/src/community/ogcapi/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/ogcapi/web-ogcapi/pom.xml b/src/community/ogcapi/web-ogcapi/pom.xml index 1458e9d1c90..c8b16ea5223 100644 --- a/src/community/ogcapi/web-ogcapi/pom.xml +++ b/src/community/ogcapi/web-ogcapi/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-ogcapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-web-ogcapi diff --git a/src/community/oseo/oseo-core/pom.xml b/src/community/oseo/oseo-core/pom.xml index 38da3be13f4..f0a489a682e 100644 --- a/src/community/oseo/oseo-core/pom.xml +++ b/src/community/oseo/oseo-core/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-oseo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/oseo/oseo-integration-tests/pom.xml b/src/community/oseo/oseo-integration-tests/pom.xml index 909cc143312..391698765b9 100644 --- a/src/community/oseo/oseo-integration-tests/pom.xml +++ b/src/community/oseo/oseo-integration-tests/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-oseo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/oseo/oseo-rest/pom.xml b/src/community/oseo/oseo-rest/pom.xml index c47f856e9a4..04d3fcf6d60 100644 --- a/src/community/oseo/oseo-rest/pom.xml +++ b/src/community/oseo/oseo-rest/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-oseo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/oseo/oseo-service/pom.xml b/src/community/oseo/oseo-service/pom.xml index a40d377b6d8..32c3b214632 100644 --- a/src/community/oseo/oseo-service/pom.xml +++ b/src/community/oseo/oseo-service/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-oseo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/oseo/oseo-stac/pom.xml b/src/community/oseo/oseo-stac/pom.xml index 103321b9c88..1b10ad47f9d 100644 --- a/src/community/oseo/oseo-stac/pom.xml +++ b/src/community/oseo/oseo-stac/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-oseo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/oseo/pom.xml b/src/community/oseo/pom.xml index 5a3bc02956b..b34f04fb68d 100644 --- a/src/community/oseo/pom.xml +++ b/src/community/oseo/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/oseo/web-oseo/pom.xml b/src/community/oseo/web-oseo/pom.xml index 2b618ec551d..b63bb2befcb 100644 --- a/src/community/oseo/web-oseo/pom.xml +++ b/src/community/oseo/web-oseo/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-oseo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/pgraster/pom.xml b/src/community/pgraster/pom.xml index 87fddaa5a52..3ccacd51deb 100644 --- a/src/community/pgraster/pom.xml +++ b/src/community/pgraster/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/pom.xml b/src/community/pom.xml index 8c7c2d3a956..7ff4a7d2afb 100644 --- a/src/community/pom.xml +++ b/src/community/pom.xml @@ -9,7 +9,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/community/programming-guide/pom.xml b/src/community/programming-guide/pom.xml index 5e247cb0e6a..b5787245b02 100644 --- a/src/community/programming-guide/pom.xml +++ b/src/community/programming-guide/pom.xml @@ -12,7 +12,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/proxy-base-ext/pom.xml b/src/community/proxy-base-ext/pom.xml index c2950128fcc..0af54978d29 100644 --- a/src/community/proxy-base-ext/pom.xml +++ b/src/community/proxy-base-ext/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/release/pom.xml b/src/community/release/pom.xml index 54ab429a5fd..5aa6908bc12 100644 --- a/src/community/release/pom.xml +++ b/src/community/release/pom.xml @@ -9,7 +9,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-release diff --git a/src/community/rest-ext/pom.xml b/src/community/rest-ext/pom.xml index cec891f8488..c5ae7d3d2e0 100644 --- a/src/community/rest-ext/pom.xml +++ b/src/community/rest-ext/pom.xml @@ -6,11 +6,11 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-rest-ext - 2.24-SNAPSHOT + 2.25-SNAPSHOT REST plugin community module http://maven.apache.org diff --git a/src/community/rest-openapi/generated/feign-client/pom.xml b/src/community/rest-openapi/generated/feign-client/pom.xml index d813b52375a..a55e928d308 100644 --- a/src/community/rest-openapi/generated/feign-client/pom.xml +++ b/src/community/rest-openapi/generated/feign-client/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-rest-openapi-generated - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest-openapi-generated-feign-client jar diff --git a/src/community/rest-openapi/generated/model/pom.xml b/src/community/rest-openapi/generated/model/pom.xml index eac8cd790d7..4e4db372c20 100644 --- a/src/community/rest-openapi/generated/model/pom.xml +++ b/src/community/rest-openapi/generated/model/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-rest-openapi-generated - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest-openapi-generated-model jar diff --git a/src/community/rest-openapi/generated/pom.xml b/src/community/rest-openapi/generated/pom.xml index 3335049e1ee..14c48866299 100644 --- a/src/community/rest-openapi/generated/pom.xml +++ b/src/community/rest-openapi/generated/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-rest-openapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest-openapi-generated pom diff --git a/src/community/rest-openapi/java-client/pom.xml b/src/community/rest-openapi/java-client/pom.xml index 1bd601fb66f..b4f84e709e1 100644 --- a/src/community/rest-openapi/java-client/pom.xml +++ b/src/community/rest-openapi/java-client/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-rest-openapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest-openapi-java-client jar diff --git a/src/community/rest-openapi/model-mapping/pom.xml b/src/community/rest-openapi/model-mapping/pom.xml index 4381fa2e3a1..55601dffcfc 100644 --- a/src/community/rest-openapi/model-mapping/pom.xml +++ b/src/community/rest-openapi/model-mapping/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-rest-openapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest-openapi-model-mapping jar diff --git a/src/community/rest-openapi/openapi/pom.xml b/src/community/rest-openapi/openapi/pom.xml index 271d7d2d280..182cd19df49 100644 --- a/src/community/rest-openapi/openapi/pom.xml +++ b/src/community/rest-openapi/openapi/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-rest-openapi - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest-openapi-spec jar diff --git a/src/community/rest-openapi/pom.xml b/src/community/rest-openapi/pom.xml index bf1836b11b4..6676a74efa9 100644 --- a/src/community/rest-openapi/pom.xml +++ b/src/community/rest-openapi/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/rest-upload/pom.xml b/src/community/rest-upload/pom.xml index f1fa322c9a5..8d7dae83ed6 100644 --- a/src/community/rest-upload/pom.xml +++ b/src/community/rest-upload/pom.xml @@ -10,13 +10,13 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-rest-upload jar - 2.24-SNAPSHOT + 2.25-SNAPSHOT Resumable REST Upload module diff --git a/src/community/s3-geotiff/pom.xml b/src/community/s3-geotiff/pom.xml index 14257f0922f..f1e62e7620d 100644 --- a/src/community/s3-geotiff/pom.xml +++ b/src/community/s3-geotiff/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/schemaless-features/mongodb-schemaless/pom.xml b/src/community/schemaless-features/mongodb-schemaless/pom.xml index 31d5fd97989..53364bc0257 100644 --- a/src/community/schemaless-features/mongodb-schemaless/pom.xml +++ b/src/community/schemaless-features/mongodb-schemaless/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-schemaless-features - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/schemaless-features/pom.xml b/src/community/schemaless-features/pom.xml index f8f124d6c59..5fb71f153c5 100644 --- a/src/community/schemaless-features/pom.xml +++ b/src/community/schemaless-features/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/schemaless-features/schemaless-core/pom.xml b/src/community/schemaless-features/schemaless-core/pom.xml index 91186e24970..92f2acf2f20 100644 --- a/src/community/schemaless-features/schemaless-core/pom.xml +++ b/src/community/schemaless-features/schemaless-core/pom.xml @@ -4,7 +4,7 @@ org.geoserver.community gs-schemaless-features - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/security/keycloak/pom.xml b/src/community/security/keycloak/pom.xml index e6c9afa530d..76e8211db67 100644 --- a/src/community/security/keycloak/pom.xml +++ b/src/community/security/keycloak/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/security/oauth2-geonode/pom.xml b/src/community/security/oauth2-geonode/pom.xml index 9b6074dd2cf..b2610d4f73d 100644 --- a/src/community/security/oauth2-geonode/pom.xml +++ b/src/community/security/oauth2-geonode/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/security/oauth2-github/pom.xml b/src/community/security/oauth2-github/pom.xml index e00589bd23e..e53225d8c30 100644 --- a/src/community/security/oauth2-github/pom.xml +++ b/src/community/security/oauth2-github/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/security/oauth2-google/pom.xml b/src/community/security/oauth2-google/pom.xml index 70bd0fc7654..e357aab18ce 100644 --- a/src/community/security/oauth2-google/pom.xml +++ b/src/community/security/oauth2-google/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/security/oauth2-openid-connect/oauth2-openid-connect-core/pom.xml b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-core/pom.xml index c5ec91ee551..a24aa972b9b 100644 --- a/src/community/security/oauth2-openid-connect/oauth2-openid-connect-core/pom.xml +++ b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-core/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community.security gs-sec-oauth2-openid-connect - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-sec-oauth2-openid-connect-core diff --git a/src/community/security/oauth2-openid-connect/oauth2-openid-connect-web/pom.xml b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-web/pom.xml index a4703dd11e2..71ad10db4c0 100644 --- a/src/community/security/oauth2-openid-connect/oauth2-openid-connect-web/pom.xml +++ b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-web/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community.security gs-sec-oauth2-openid-connect - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-sec-oauth2-openid-connect-web diff --git a/src/community/security/oauth2-openid-connect/pom.xml b/src/community/security/oauth2-openid-connect/pom.xml index f1cbc201f77..f91e20b82bb 100644 --- a/src/community/security/oauth2-openid-connect/pom.xml +++ b/src/community/security/oauth2-openid-connect/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community.security diff --git a/src/community/security/oauth2/oauth2-core/pom.xml b/src/community/security/oauth2/oauth2-core/pom.xml index b364ee96cbe..3f30a6c469a 100644 --- a/src/community/security/oauth2/oauth2-core/pom.xml +++ b/src/community/security/oauth2/oauth2-core/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community.security gs-sec-oauth2 - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-sec-oauth2-core diff --git a/src/community/security/oauth2/oauth2-web/pom.xml b/src/community/security/oauth2/oauth2-web/pom.xml index d8de0dfc1bf..a6b4ebadd0b 100644 --- a/src/community/security/oauth2/oauth2-web/pom.xml +++ b/src/community/security/oauth2/oauth2-web/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community.security gs-sec-oauth2 - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-sec-oauth2-web diff --git a/src/community/security/oauth2/pom.xml b/src/community/security/oauth2/pom.xml index 02110cfcc80..c564ffc62d1 100644 --- a/src/community/security/oauth2/pom.xml +++ b/src/community/security/oauth2/pom.xml @@ -12,7 +12,7 @@ org.geoserver.community gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community.security diff --git a/src/community/security/pom.xml b/src/community/security/pom.xml index 9142678fd1e..9a6958f3f03 100644 --- a/src/community/security/pom.xml +++ b/src/community/security/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/smart-data-loader/pom.xml b/src/community/smart-data-loader/pom.xml index 0d9acb4afd3..dd1c9302454 100644 --- a/src/community/smart-data-loader/pom.xml +++ b/src/community/smart-data-loader/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/solr/pom.xml b/src/community/solr/pom.xml index 365fd7d9294..b84beccdaf8 100644 --- a/src/community/solr/pom.xml +++ b/src/community/solr/pom.xml @@ -9,7 +9,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/spatialjson/pom.xml b/src/community/spatialjson/pom.xml index da15520e1cd..ea3e7e2b7ea 100644 --- a/src/community/spatialjson/pom.xml +++ b/src/community/spatialjson/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/taskmanager/core/pom.xml b/src/community/taskmanager/core/pom.xml index b5eed2c69a9..5280ed76519 100644 --- a/src/community/taskmanager/core/pom.xml +++ b/src/community/taskmanager/core/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-taskmanager - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/taskmanager/metadata/pom.xml b/src/community/taskmanager/metadata/pom.xml index 20078bb61fd..e9544032818 100644 --- a/src/community/taskmanager/metadata/pom.xml +++ b/src/community/taskmanager/metadata/pom.xml @@ -6,12 +6,12 @@ org.geoserver.community gs-taskmanager - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-taskmanager-metadata - 2.24-SNAPSHOT + 2.25-SNAPSHOT jar GeoServer Task Manager Metadata diff --git a/src/community/taskmanager/pom.xml b/src/community/taskmanager/pom.xml index bbd530a03c7..4eae9c093ec 100644 --- a/src/community/taskmanager/pom.xml +++ b/src/community/taskmanager/pom.xml @@ -6,7 +6,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/taskmanager/s3/pom.xml b/src/community/taskmanager/s3/pom.xml index 6c64f5f107e..3a8beb8c835 100644 --- a/src/community/taskmanager/s3/pom.xml +++ b/src/community/taskmanager/s3/pom.xml @@ -6,7 +6,7 @@ org.geoserver.community gs-taskmanager - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/vector-mosaic/pom.xml b/src/community/vector-mosaic/pom.xml index a3a3f8d2661..89f25f254c9 100644 --- a/src/community/vector-mosaic/pom.xml +++ b/src/community/vector-mosaic/pom.xml @@ -10,7 +10,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/vsi/pom.xml b/src/community/vsi/pom.xml index 9d5f4d9097a..390aea8fdee 100644 --- a/src/community/vsi/pom.xml +++ b/src/community/vsi/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/web-ogr/pom.xml b/src/community/web-ogr/pom.xml index 36b15ab9277..6b9aa795d8e 100644 --- a/src/community/web-ogr/pom.xml +++ b/src/community/web-ogr/pom.xml @@ -4,7 +4,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-web-ogr diff --git a/src/community/web-service-auth/pom.xml b/src/community/web-service-auth/pom.xml index 4bab6624522..ddaaac979d4 100644 --- a/src/community/web-service-auth/pom.xml +++ b/src/community/web-service-auth/pom.xml @@ -4,11 +4,11 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community gs-web-service-auth - 2.24-SNAPSHOT + 2.25-SNAPSHOT jar Web Service Authentication Provider diff --git a/src/community/webp/pom.xml b/src/community/webp/pom.xml index bdf0360c539..3fd9367bf4b 100644 --- a/src/community/webp/pom.xml +++ b/src/community/webp/pom.xml @@ -11,7 +11,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/wps-longitudinal-profile/pom.xml b/src/community/wps-longitudinal-profile/pom.xml index c074e116b9d..88bfeee6c7b 100644 --- a/src/community/wps-longitudinal-profile/pom.xml +++ b/src/community/wps-longitudinal-profile/pom.xml @@ -8,7 +8,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/wps-remote/pom.xml b/src/community/wps-remote/pom.xml index 16a5dcbcb71..521d6e82187 100644 --- a/src/community/wps-remote/pom.xml +++ b/src/community/wps-remote/pom.xml @@ -8,7 +8,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/wps-sextante/pom.xml b/src/community/wps-sextante/pom.xml index 1a7a9ea1894..1477649461e 100644 --- a/src/community/wps-sextante/pom.xml +++ b/src/community/wps-sextante/pom.xml @@ -12,7 +12,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.community diff --git a/src/community/xslt/pom.xml b/src/community/xslt/pom.xml index 7905ddd3073..55becb9152e 100644 --- a/src/community/xslt/pom.xml +++ b/src/community/xslt/pom.xml @@ -5,7 +5,7 @@ org.geoserver community - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/extension/app-schema/app-schema-core/pom.xml b/src/extension/app-schema/app-schema-core/pom.xml index 68aa00b284a..506ee0b26a8 100644 --- a/src/extension/app-schema/app-schema-core/pom.xml +++ b/src/extension/app-schema/app-schema-core/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/app-schema-geopkg-test/pom.xml b/src/extension/app-schema/app-schema-geopkg-test/pom.xml index d1321377bb8..3421feaf866 100644 --- a/src/extension/app-schema/app-schema-geopkg-test/pom.xml +++ b/src/extension/app-schema/app-schema-geopkg-test/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/app-schema-indexes-test/pom.xml b/src/extension/app-schema/app-schema-indexes-test/pom.xml index cf57350dc73..d95f8f06d37 100644 --- a/src/extension/app-schema/app-schema-indexes-test/pom.xml +++ b/src/extension/app-schema/app-schema-indexes-test/pom.xml @@ -7,7 +7,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-app-schema-indexes-test diff --git a/src/extension/app-schema/app-schema-mongo-test/pom.xml b/src/extension/app-schema/app-schema-mongo-test/pom.xml index d346caa845a..53c9dd5265b 100644 --- a/src/extension/app-schema/app-schema-mongo-test/pom.xml +++ b/src/extension/app-schema/app-schema-mongo-test/pom.xml @@ -12,7 +12,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/app-schema-oracle-test/pom.xml b/src/extension/app-schema/app-schema-oracle-test/pom.xml index a87c92053cc..fbc8ec08f5e 100644 --- a/src/extension/app-schema/app-schema-oracle-test/pom.xml +++ b/src/extension/app-schema/app-schema-oracle-test/pom.xml @@ -12,7 +12,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/app-schema-postgis-test/pom.xml b/src/extension/app-schema/app-schema-postgis-test/pom.xml index 01f33902dc4..5686ff09e11 100644 --- a/src/extension/app-schema/app-schema-postgis-test/pom.xml +++ b/src/extension/app-schema/app-schema-postgis-test/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/app-schema-solr-test/pom.xml b/src/extension/app-schema/app-schema-solr-test/pom.xml index af32ae1550b..ba0eb199fa9 100644 --- a/src/extension/app-schema/app-schema-solr-test/pom.xml +++ b/src/extension/app-schema/app-schema-solr-test/pom.xml @@ -7,7 +7,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-app-schema-solr-test diff --git a/src/extension/app-schema/app-schema-test/pom.xml b/src/extension/app-schema/app-schema-test/pom.xml index f3392408ccc..e0b79fdcc6f 100644 --- a/src/extension/app-schema/app-schema-test/pom.xml +++ b/src/extension/app-schema/app-schema-test/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/pom.xml b/src/extension/app-schema/pom.xml index 53243b510c1..a2c42acd912 100644 --- a/src/extension/app-schema/pom.xml +++ b/src/extension/app-schema/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/app-schema/sample-data-access-test/pom.xml b/src/extension/app-schema/sample-data-access-test/pom.xml index 4e436299aa3..57c344ec554 100644 --- a/src/extension/app-schema/sample-data-access-test/pom.xml +++ b/src/extension/app-schema/sample-data-access-test/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-app-schema - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/authkey/pom.xml b/src/extension/authkey/pom.xml index 509dfa29f4e..5579bb4ebc6 100644 --- a/src/extension/authkey/pom.xml +++ b/src/extension/authkey/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/charts/pom.xml b/src/extension/charts/pom.xml index d94286b5569..6b563a0a952 100644 --- a/src/extension/charts/pom.xml +++ b/src/extension/charts/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-charts diff --git a/src/extension/control-flow/pom.xml b/src/extension/control-flow/pom.xml index 46a351804bb..6d3fb77a364 100644 --- a/src/extension/control-flow/pom.xml +++ b/src/extension/control-flow/pom.xml @@ -9,7 +9,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-control-flow diff --git a/src/extension/css/pom.xml b/src/extension/css/pom.xml index ea696e943fa..1da85cf5235 100644 --- a/src/extension/css/pom.xml +++ b/src/extension/css/pom.xml @@ -4,7 +4,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-css diff --git a/src/extension/csw/api/pom.xml b/src/extension/csw/api/pom.xml index bbc4b9fe084..585366a0da3 100644 --- a/src/extension/csw/api/pom.xml +++ b/src/extension/csw/api/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-csw - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.csw diff --git a/src/extension/csw/core/pom.xml b/src/extension/csw/core/pom.xml index da2e0d4d9e0..7d006a095e2 100644 --- a/src/extension/csw/core/pom.xml +++ b/src/extension/csw/core/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-csw - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.csw diff --git a/src/extension/csw/csw-iso/pom.xml b/src/extension/csw/csw-iso/pom.xml index 082876c43d5..645239a61b0 100644 --- a/src/extension/csw/csw-iso/pom.xml +++ b/src/extension/csw/csw-iso/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-csw - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.csw diff --git a/src/extension/csw/pom.xml b/src/extension/csw/pom.xml index c0f0c10778a..536bce740c8 100644 --- a/src/extension/csw/pom.xml +++ b/src/extension/csw/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/extension/csw/simple-store/pom.xml b/src/extension/csw/simple-store/pom.xml index 8bbfc5f99f1..da71d992ad0 100644 --- a/src/extension/csw/simple-store/pom.xml +++ b/src/extension/csw/simple-store/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-csw - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.csw diff --git a/src/extension/csw/web-csw/pom.xml b/src/extension/csw/web-csw/pom.xml index 2ebd3a5865d..6c03f36024d 100644 --- a/src/extension/csw/web-csw/pom.xml +++ b/src/extension/csw/web-csw/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-csw - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.csw diff --git a/src/extension/db2/pom.xml b/src/extension/db2/pom.xml index e6d59743545..16b37f19107 100644 --- a/src/extension/db2/pom.xml +++ b/src/extension/db2/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/dxf/core/pom.xml b/src/extension/dxf/core/pom.xml index d8e7d4d5e86..3b858206b17 100644 --- a/src/extension/dxf/core/pom.xml +++ b/src/extension/dxf/core/pom.xml @@ -12,7 +12,7 @@ org.geoserver.extension gs-dxf - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/dxf/pom.xml b/src/extension/dxf/pom.xml index 38b5756f3c1..6b9f48b5a9e 100644 --- a/src/extension/dxf/pom.xml +++ b/src/extension/dxf/pom.xml @@ -12,7 +12,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/dxf/wps/pom.xml b/src/extension/dxf/wps/pom.xml index aae311f701c..18990816aea 100644 --- a/src/extension/dxf/wps/pom.xml +++ b/src/extension/dxf/wps/pom.xml @@ -12,7 +12,7 @@ org.geoserver.extension gs-dxf - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/excel/pom.xml b/src/extension/excel/pom.xml index 02bf1fa3d62..51960ba72b6 100644 --- a/src/extension/excel/pom.xml +++ b/src/extension/excel/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-excel diff --git a/src/extension/feature-pregeneralized/pom.xml b/src/extension/feature-pregeneralized/pom.xml index 6b00666f7df..c7888ba9dc8 100644 --- a/src/extension/feature-pregeneralized/pom.xml +++ b/src/extension/feature-pregeneralized/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/gdal/pom.xml b/src/extension/gdal/pom.xml index 02ae66ce4e5..9df7d255dcd 100644 --- a/src/extension/gdal/pom.xml +++ b/src/extension/gdal/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/geofence/geofence-server/pom.xml b/src/extension/geofence/geofence-server/pom.xml index c6e30b4eac6..70132042258 100644 --- a/src/extension/geofence/geofence-server/pom.xml +++ b/src/extension/geofence/geofence-server/pom.xml @@ -5,7 +5,7 @@ org.geoserver.extension gs-geofence-root - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/geofence/geofence-wps/pom.xml b/src/extension/geofence/geofence-wps/pom.xml index af8904cc2b0..cb92db762ad 100644 --- a/src/extension/geofence/geofence-wps/pom.xml +++ b/src/extension/geofence/geofence-wps/pom.xml @@ -5,7 +5,7 @@ org.geoserver.extension gs-geofence-root - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/geofence/geofence/pom.xml b/src/extension/geofence/geofence/pom.xml index d374a6d2e7d..c0f3000aecb 100644 --- a/src/extension/geofence/geofence/pom.xml +++ b/src/extension/geofence/geofence/pom.xml @@ -5,7 +5,7 @@ org.geoserver.extension gs-geofence-root - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/geofence/pom.xml b/src/extension/geofence/pom.xml index 7eb54f70e1d..d5f67fe2637 100644 --- a/src/extension/geofence/pom.xml +++ b/src/extension/geofence/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/geopkg-output/pom.xml b/src/extension/geopkg-output/pom.xml index 57e5019c414..b134f2d249f 100644 --- a/src/extension/geopkg-output/pom.xml +++ b/src/extension/geopkg-output/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/grib/pom.xml b/src/extension/grib/pom.xml index 11f3a0047ad..2aafad04a81 100644 --- a/src/extension/grib/pom.xml +++ b/src/extension/grib/pom.xml @@ -4,7 +4,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/gwc-s3/pom.xml b/src/extension/gwc-s3/pom.xml index e42573b651e..a972ba12b86 100644 --- a/src/extension/gwc-s3/pom.xml +++ b/src/extension/gwc-s3/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/h2/pom.xml b/src/extension/h2/pom.xml index 73f23049a71..c0ef2e0f3d5 100644 --- a/src/extension/h2/pom.xml +++ b/src/extension/h2/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/importer/core/pom.xml b/src/extension/importer/core/pom.xml index 36a67c643b7..875c826ca0d 100644 --- a/src/extension/importer/core/pom.xml +++ b/src/extension/importer/core/pom.xml @@ -6,7 +6,7 @@ org.geoserver gs-importer - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.importer diff --git a/src/extension/importer/pom.xml b/src/extension/importer/pom.xml index 8e9c64eddcf..93882d1987c 100644 --- a/src/extension/importer/pom.xml +++ b/src/extension/importer/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/extension/importer/rest/pom.xml b/src/extension/importer/rest/pom.xml index a847a9c77a2..9a4f0c193b4 100644 --- a/src/extension/importer/rest/pom.xml +++ b/src/extension/importer/rest/pom.xml @@ -4,7 +4,7 @@ org.geoserver gs-importer - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.importer gs-importer-rest diff --git a/src/extension/importer/web/pom.xml b/src/extension/importer/web/pom.xml index 1faf89f6241..2b02006b26e 100644 --- a/src/extension/importer/web/pom.xml +++ b/src/extension/importer/web/pom.xml @@ -6,7 +6,7 @@ org.geoserver gs-importer - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.importer diff --git a/src/extension/inspire/pom.xml b/src/extension/inspire/pom.xml index a9084cb3e2a..3a24ca79c75 100644 --- a/src/extension/inspire/pom.xml +++ b/src/extension/inspire/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/jp2k/pom.xml b/src/extension/jp2k/pom.xml index 6ce01118bcb..846a894d3b8 100644 --- a/src/extension/jp2k/pom.xml +++ b/src/extension/jp2k/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/libjpeg-turbo/pom.xml b/src/extension/libjpeg-turbo/pom.xml index d01f09232e6..e8a0a03ddc8 100644 --- a/src/extension/libjpeg-turbo/pom.xml +++ b/src/extension/libjpeg-turbo/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/mapml/pom.xml b/src/extension/mapml/pom.xml index 0d2baa6bddf..384fee810b2 100644 --- a/src/extension/mapml/pom.xml +++ b/src/extension/mapml/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/mbstyle/pom.xml b/src/extension/mbstyle/pom.xml index 4ef7652a910..6ec651ce751 100644 --- a/src/extension/mbstyle/pom.xml +++ b/src/extension/mbstyle/pom.xml @@ -4,7 +4,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/metadata/pom.xml b/src/extension/metadata/pom.xml index cc7f51e9279..bc15c9fd347 100644 --- a/src/extension/metadata/pom.xml +++ b/src/extension/metadata/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/mongodb/pom.xml b/src/extension/mongodb/pom.xml index 3849cfa4d17..e823030fdde 100644 --- a/src/extension/mongodb/pom.xml +++ b/src/extension/mongodb/pom.xml @@ -4,7 +4,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-mongodb diff --git a/src/extension/monitor/core/pom.xml b/src/extension/monitor/core/pom.xml index c904c282506..c3604bab1b0 100644 --- a/src/extension/monitor/core/pom.xml +++ b/src/extension/monitor/core/pom.xml @@ -9,7 +9,7 @@ org.geoserver.extension gs-monitor - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-monitor-core diff --git a/src/extension/monitor/pom.xml b/src/extension/monitor/pom.xml index fe4255bf9ba..563c3a4d31b 100644 --- a/src/extension/monitor/pom.xml +++ b/src/extension/monitor/pom.xml @@ -9,7 +9,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-monitor diff --git a/src/extension/mysql/pom.xml b/src/extension/mysql/pom.xml index c669b550bc3..51a9e1266df 100644 --- a/src/extension/mysql/pom.xml +++ b/src/extension/mysql/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/netcdf-out/pom.xml b/src/extension/netcdf-out/pom.xml index 659839a4219..48019b65db9 100644 --- a/src/extension/netcdf-out/pom.xml +++ b/src/extension/netcdf-out/pom.xml @@ -20,7 +20,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/netcdf/pom.xml b/src/extension/netcdf/pom.xml index c1819a09480..c3ddc368ae6 100644 --- a/src/extension/netcdf/pom.xml +++ b/src/extension/netcdf/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/ogr/ogr-core/pom.xml b/src/extension/ogr/ogr-core/pom.xml index f751817a00c..9c2ee3a6fce 100644 --- a/src/extension/ogr/ogr-core/pom.xml +++ b/src/extension/ogr/ogr-core/pom.xml @@ -10,7 +10,7 @@ org.geoserver.extension gs-ogr - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/ogr/ogr-wfs/pom.xml b/src/extension/ogr/ogr-wfs/pom.xml index d32caa114b8..473f5d1af2a 100644 --- a/src/extension/ogr/ogr-wfs/pom.xml +++ b/src/extension/ogr/ogr-wfs/pom.xml @@ -10,7 +10,7 @@ org.geoserver.extension gs-ogr - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/ogr/ogr-wps/pom.xml b/src/extension/ogr/ogr-wps/pom.xml index 1342e28dbc9..cfd4ab1e343 100644 --- a/src/extension/ogr/ogr-wps/pom.xml +++ b/src/extension/ogr/ogr-wps/pom.xml @@ -8,7 +8,7 @@ org.geoserver.extension gs-ogr - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/ogr/pom.xml b/src/extension/ogr/pom.xml index ea1147b56d8..48b7aac0f84 100644 --- a/src/extension/ogr/pom.xml +++ b/src/extension/ogr/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/oracle/pom.xml b/src/extension/oracle/pom.xml index 79a9673d65a..3ae73999b00 100644 --- a/src/extension/oracle/pom.xml +++ b/src/extension/oracle/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/params-extractor/pom.xml b/src/extension/params-extractor/pom.xml index db1c5b75f7d..c57824f9aa9 100644 --- a/src/extension/params-extractor/pom.xml +++ b/src/extension/params-extractor/pom.xml @@ -5,7 +5,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/pom.xml b/src/extension/pom.xml index beed8a11ff8..410b3b20ea1 100644 --- a/src/extension/pom.xml +++ b/src/extension/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/extension/printing/pom.xml b/src/extension/printing/pom.xml index fe6bea2b9cd..25697e24c18 100644 --- a/src/extension/printing/pom.xml +++ b/src/extension/printing/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/querylayer/pom.xml b/src/extension/querylayer/pom.xml index 703eec5ddc9..6bed663de61 100644 --- a/src/extension/querylayer/pom.xml +++ b/src/extension/querylayer/pom.xml @@ -9,7 +9,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-querylayer diff --git a/src/extension/security/cas/pom.xml b/src/extension/security/cas/pom.xml index 228903baa11..b3cbbecfb40 100644 --- a/src/extension/security/cas/pom.xml +++ b/src/extension/security/cas/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.security diff --git a/src/extension/security/pom.xml b/src/extension/security/pom.xml index 425f8501bbf..f68488486ff 100644 --- a/src/extension/security/pom.xml +++ b/src/extension/security/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/security/web/pom.xml b/src/extension/security/web/pom.xml index 54b8f8bc929..94d43044b9b 100644 --- a/src/extension/security/web/pom.xml +++ b/src/extension/security/web/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/security/web/web-cas/pom.xml b/src/extension/security/web/web-cas/pom.xml index 101cd748556..1bfa642e4bd 100644 --- a/src/extension/security/web/web-cas/pom.xml +++ b/src/extension/security/web/web-cas/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-web-sec - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.security diff --git a/src/extension/sldService/pom.xml b/src/extension/sldService/pom.xml index 184447fcfac..04ef6a1a19a 100644 --- a/src/extension/sldService/pom.xml +++ b/src/extension/sldService/pom.xml @@ -10,7 +10,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/sqlserver/pom.xml b/src/extension/sqlserver/pom.xml index e59bf7c2b2b..d2570680e37 100644 --- a/src/extension/sqlserver/pom.xml +++ b/src/extension/sqlserver/pom.xml @@ -8,7 +8,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/vectortiles/pom.xml b/src/extension/vectortiles/pom.xml index 50206e69607..fbdd54bde96 100644 --- a/src/extension/vectortiles/pom.xml +++ b/src/extension/vectortiles/pom.xml @@ -5,7 +5,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wcs2_0-eo/core/pom.xml b/src/extension/wcs2_0-eo/core/pom.xml index de55aad81da..d31118e8aa4 100644 --- a/src/extension/wcs2_0-eo/core/pom.xml +++ b/src/extension/wcs2_0-eo/core/pom.xml @@ -10,7 +10,7 @@ application directory. org.geoserver.extension gs-wcs2_0-eo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wcs2_0-eo/pom.xml b/src/extension/wcs2_0-eo/pom.xml index 08b5f9f7610..d2b1e20e8f2 100644 --- a/src/extension/wcs2_0-eo/pom.xml +++ b/src/extension/wcs2_0-eo/pom.xml @@ -9,7 +9,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-wcs2_0-eo diff --git a/src/extension/wcs2_0-eo/web/pom.xml b/src/extension/wcs2_0-eo/web/pom.xml index f86b9fd9283..5cb8d5d0036 100644 --- a/src/extension/wcs2_0-eo/web/pom.xml +++ b/src/extension/wcs2_0-eo/web/pom.xml @@ -10,7 +10,7 @@ application directory. org.geoserver.extension gs-wcs2_0-eo - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/web-resource/pom.xml b/src/extension/web-resource/pom.xml index 06734dfb4fc..898fd78750f 100644 --- a/src/extension/web-resource/pom.xml +++ b/src/extension/web-resource/pom.xml @@ -4,7 +4,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-web-resource diff --git a/src/extension/wmts-multi-dimensional/pom.xml b/src/extension/wmts-multi-dimensional/pom.xml index f0f5f6f57c1..7752e0dbe2e 100644 --- a/src/extension/wmts-multi-dimensional/pom.xml +++ b/src/extension/wmts-multi-dimensional/pom.xml @@ -4,7 +4,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-wmts-multi-dimensional diff --git a/src/extension/wps-download/pom.xml b/src/extension/wps-download/pom.xml index 3a171705406..4f140df2880 100644 --- a/src/extension/wps-download/pom.xml +++ b/src/extension/wps-download/pom.xml @@ -5,7 +5,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wps-jdbc/pom.xml b/src/extension/wps-jdbc/pom.xml index 4a46b564ccb..c3915e73bfa 100644 --- a/src/extension/wps-jdbc/pom.xml +++ b/src/extension/wps-jdbc/pom.xml @@ -5,7 +5,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension gs-wps-jdbc diff --git a/src/extension/wps/pom.xml b/src/extension/wps/pom.xml index f0aed0bd6e9..35120e6d584 100644 --- a/src/extension/wps/pom.xml +++ b/src/extension/wps/pom.xml @@ -11,7 +11,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wps/web-wps/pom.xml b/src/extension/wps/web-wps/pom.xml index 5e513506b12..9655d8e4214 100644 --- a/src/extension/wps/web-wps/pom.xml +++ b/src/extension/wps/web-wps/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-wps - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wps/wps-cluster-hazelcast/pom.xml b/src/extension/wps/wps-cluster-hazelcast/pom.xml index 5ac7bfbc22b..523eedf1504 100644 --- a/src/extension/wps/wps-cluster-hazelcast/pom.xml +++ b/src/extension/wps/wps-cluster-hazelcast/pom.xml @@ -9,7 +9,7 @@ org.geoserver.extension gs-wps - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wps/wps-core/pom.xml b/src/extension/wps/wps-core/pom.xml index 768f2a18d30..14f90a8bdcc 100644 --- a/src/extension/wps/wps-core/pom.xml +++ b/src/extension/wps/wps-core/pom.xml @@ -11,7 +11,7 @@ org.geoserver.extension gs-wps - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/wps/wps-kml-ppio/pom.xml b/src/extension/wps/wps-kml-ppio/pom.xml index 15369819c4e..ef7bcca069f 100644 --- a/src/extension/wps/wps-kml-ppio/pom.xml +++ b/src/extension/wps/wps-kml-ppio/pom.xml @@ -10,7 +10,7 @@ org.geoserver.extension gs-wps - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/extension/ysld/pom.xml b/src/extension/ysld/pom.xml index 2ccac820c19..cb5cfb89017 100644 --- a/src/extension/ysld/pom.xml +++ b/src/extension/ysld/pom.xml @@ -6,7 +6,7 @@ org.geoserver extension - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.extension diff --git a/src/gwc-rest/pom.xml b/src/gwc-rest/pom.xml index 4ca33db2c43..748fa4e22c6 100644 --- a/src/gwc-rest/pom.xml +++ b/src/gwc-rest/pom.xml @@ -5,7 +5,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/gwc/pom.xml b/src/gwc/pom.xml index 3299137c6ad..53b1fbb20e7 100644 --- a/src/gwc/pom.xml +++ b/src/gwc/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/kml/pom.xml b/src/kml/pom.xml index 88f036adb74..4b01ade7f7e 100644 --- a/src/kml/pom.xml +++ b/src/kml/pom.xml @@ -8,7 +8,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/main/pom.xml b/src/main/pom.xml index fdbf5ab6542..0b2d94a6282 100644 --- a/src/main/pom.xml +++ b/src/main/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/maven/archetype/pom.xml b/src/maven/archetype/pom.xml index 9715719ab04..4f7825b717b 100644 --- a/src/maven/archetype/pom.xml +++ b/src/maven/archetype/pom.xml @@ -11,7 +11,7 @@ txsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/m org.geoserver gs-maven - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.maven diff --git a/src/maven/archetype/webPlugin/pom.xml b/src/maven/archetype/webPlugin/pom.xml index 8061ffa5b9a..5bfadd6d557 100644 --- a/src/maven/archetype/webPlugin/pom.xml +++ b/src/maven/archetype/webPlugin/pom.xml @@ -5,7 +5,7 @@ org.geoserver.maven gs-archetype - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.maven diff --git a/src/maven/archetype/webPlugin/src/main/resources/archetype-resources/pom.xml b/src/maven/archetype/webPlugin/src/main/resources/archetype-resources/pom.xml index 42ffa108286..ec617489b14 100644 --- a/src/maven/archetype/webPlugin/src/main/resources/archetype-resources/pom.xml +++ b/src/maven/archetype/webPlugin/src/main/resources/archetype-resources/pom.xml @@ -24,12 +24,12 @@ org.geoserver.web web-core - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web web-core - 2.24-SNAPSHOT + 2.25-SNAPSHOT tests test @@ -42,7 +42,7 @@ org.geoserver main - 2.24-SNAPSHOT + 2.25-SNAPSHOT tests test diff --git a/src/maven/archetype/wfsOutputFormat/pom.xml b/src/maven/archetype/wfsOutputFormat/pom.xml index 2f3257dfdf4..95ec1b098ce 100644 --- a/src/maven/archetype/wfsOutputFormat/pom.xml +++ b/src/maven/archetype/wfsOutputFormat/pom.xml @@ -5,7 +5,7 @@ org.geoserver.maven gs-archetype - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.maven diff --git a/src/maven/archetype/wfsOutputFormat/src/main/resources/archetype-resources/pom.xml b/src/maven/archetype/wfsOutputFormat/src/main/resources/archetype-resources/pom.xml index 738560e24dc..c91bc392054 100644 --- a/src/maven/archetype/wfsOutputFormat/src/main/resources/archetype-resources/pom.xml +++ b/src/maven/archetype/wfsOutputFormat/src/main/resources/archetype-resources/pom.xml @@ -11,7 +11,7 @@ org.geoserver wfs - 2.24-SNAPSHOT + 2.25-SNAPSHOT junit @@ -22,14 +22,14 @@ org.geoserver wfs - 2.24-SNAPSHOT + 2.25-SNAPSHOT tests test org.geoserver main - 2.24-SNAPSHOT + 2.25-SNAPSHOT tests test diff --git a/src/maven/config/pom.xml b/src/maven/config/pom.xml index 12bfb6cb415..0fa168749a6 100644 --- a/src/maven/config/pom.xml +++ b/src/maven/config/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-maven - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.maven diff --git a/src/maven/pom.xml b/src/maven/pom.xml index 95228813a58..1241566a4be 100644 --- a/src/maven/pom.xml +++ b/src/maven/pom.xml @@ -11,7 +11,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/ows/pom.xml b/src/ows/pom.xml index 6f8da3830e4..bdd0ae34c3d 100644 --- a/src/ows/pom.xml +++ b/src/ows/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/platform/pom.xml b/src/platform/pom.xml index 313ff4d98e7..f38a9b7fa27 100644 --- a/src/platform/pom.xml +++ b/src/platform/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-platform diff --git a/src/pom.xml b/src/pom.xml index 06ce2eab67b..43dee2adecf 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -9,7 +9,7 @@ 4.0.0 org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT pom GeoServer 2006 @@ -88,9 +88,9 @@ - 2.24-SNAPSHOT - 30-SNAPSHOT - 1.24-SNAPSHOT + 2.25-SNAPSHOT + 31-SNAPSHOT + 1.25-SNAPSHOT 1.19.0 5.3.27 5.7.10 diff --git a/src/release/installer/mac/console/pom.xml b/src/release/installer/mac/console/pom.xml index 5ae20b7a61d..4d8a98b1f7f 100644 --- a/src/release/installer/mac/console/pom.xml +++ b/src/release/installer/mac/console/pom.xml @@ -11,7 +11,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver console diff --git a/src/release/pom.xml b/src/release/pom.xml index 715a28a3c5d..c4285f6cfac 100644 --- a/src/release/pom.xml +++ b/src/release/pom.xml @@ -9,7 +9,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver gs-release diff --git a/src/rest/pom.xml b/src/rest/pom.xml index a576c0dc146..953976a05c1 100644 --- a/src/rest/pom.xml +++ b/src/rest/pom.xml @@ -4,7 +4,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-rest diff --git a/src/restconfig-wcs/pom.xml b/src/restconfig-wcs/pom.xml index c8f90922a8e..b98f8236470 100644 --- a/src/restconfig-wcs/pom.xml +++ b/src/restconfig-wcs/pom.xml @@ -4,7 +4,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-restconfig-wcs diff --git a/src/restconfig-wfs/pom.xml b/src/restconfig-wfs/pom.xml index 58b2df30f2a..a7d1819e8b9 100644 --- a/src/restconfig-wfs/pom.xml +++ b/src/restconfig-wfs/pom.xml @@ -4,7 +4,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-restconfig-wfs diff --git a/src/restconfig-wms/pom.xml b/src/restconfig-wms/pom.xml index 085109268ff..ff66b1fc449 100644 --- a/src/restconfig-wms/pom.xml +++ b/src/restconfig-wms/pom.xml @@ -4,7 +4,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-restconfig-wms diff --git a/src/restconfig-wmts/pom.xml b/src/restconfig-wmts/pom.xml index 5ee75f9211b..f878664e32b 100644 --- a/src/restconfig-wmts/pom.xml +++ b/src/restconfig-wmts/pom.xml @@ -4,7 +4,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/restconfig/pom.xml b/src/restconfig/pom.xml index 22bc58ca209..593ba314b71 100644 --- a/src/restconfig/pom.xml +++ b/src/restconfig/pom.xml @@ -4,7 +4,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT gs-restconfig diff --git a/src/security/jdbc/pom.xml b/src/security/jdbc/pom.xml index 831df32cfc6..a09fca3dfa3 100644 --- a/src/security/jdbc/pom.xml +++ b/src/security/jdbc/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.security gs-sec-jdbc diff --git a/src/security/ldap/pom.xml b/src/security/ldap/pom.xml index 9c983c6f6b0..a51176a91bf 100644 --- a/src/security/ldap/pom.xml +++ b/src/security/ldap/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.security diff --git a/src/security/pom.xml b/src/security/pom.xml index f697de8d32f..2a7b25b13fc 100644 --- a/src/security/pom.xml +++ b/src/security/pom.xml @@ -11,7 +11,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/security/security-tests/pom.xml b/src/security/security-tests/pom.xml index 56ec7b20c7c..8a6ea111eab 100644 --- a/src/security/security-tests/pom.xml +++ b/src/security/security-tests/pom.xml @@ -11,7 +11,7 @@ org.geoserver gs-security - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.security gs-security-tests diff --git a/src/wcs/pom.xml b/src/wcs/pom.xml index b569d3f215a..beda98bed11 100644 --- a/src/wcs/pom.xml +++ b/src/wcs/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/wcs1_0/pom.xml b/src/wcs1_0/pom.xml index a821b88f9ed..f89d66f3b6d 100644 --- a/src/wcs1_0/pom.xml +++ b/src/wcs1_0/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/wcs1_1/pom.xml b/src/wcs1_1/pom.xml index 5cb6ccbc701..9110b9f9b3f 100644 --- a/src/wcs1_1/pom.xml +++ b/src/wcs1_1/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/wcs2_0/pom.xml b/src/wcs2_0/pom.xml index 23500740fcd..f85555f5928 100644 --- a/src/wcs2_0/pom.xml +++ b/src/wcs2_0/pom.xml @@ -10,7 +10,7 @@ application directory. org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/web/app/pom.xml b/src/web/app/pom.xml index 4a077c8b31f..aa58b1d4eed 100644 --- a/src/web/app/pom.xml +++ b/src/web/app/pom.xml @@ -9,7 +9,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web gs-web-app diff --git a/src/web/core/pom.xml b/src/web/core/pom.xml index 8d70a5e331f..d4e5901d0d8 100644 --- a/src/web/core/pom.xml +++ b/src/web/core/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/demo/pom.xml b/src/web/demo/pom.xml index 94881b2ef53..bc142d7519f 100644 --- a/src/web/demo/pom.xml +++ b/src/web/demo/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/gwc/pom.xml b/src/web/gwc/pom.xml index 8f0fe564a48..28fd5339c61 100644 --- a/src/web/gwc/pom.xml +++ b/src/web/gwc/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/pom.xml b/src/web/pom.xml index 17883d29d59..bcd0cd6c489 100644 --- a/src/web/pom.xml +++ b/src/web/pom.xml @@ -11,7 +11,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/web/rest/pom.xml b/src/web/rest/pom.xml index d6c360dc3da..8b43d3b6302 100644 --- a/src/web/rest/pom.xml +++ b/src/web/rest/pom.xml @@ -4,7 +4,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web gs-web-rest diff --git a/src/web/security/core/pom.xml b/src/web/security/core/pom.xml index 4265938efde..4e35dec2a9e 100644 --- a/src/web/security/core/pom.xml +++ b/src/web/security/core/pom.xml @@ -11,7 +11,7 @@ org.geoserver.web gs-web-sec - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/security/jdbc/pom.xml b/src/web/security/jdbc/pom.xml index c245d87ffcb..0b495bf189b 100644 --- a/src/web/security/jdbc/pom.xml +++ b/src/web/security/jdbc/pom.xml @@ -11,7 +11,7 @@ org.geoserver.web gs-web-sec - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/security/ldap/pom.xml b/src/web/security/ldap/pom.xml index 784b16d9edf..5bd3f457570 100644 --- a/src/web/security/ldap/pom.xml +++ b/src/web/security/ldap/pom.xml @@ -11,7 +11,7 @@ org.geoserver.web gs-web-sec - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/security/pom.xml b/src/web/security/pom.xml index d6d17066771..e3c77b713f7 100644 --- a/src/web/security/pom.xml +++ b/src/web/security/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/wcs/pom.xml b/src/web/wcs/pom.xml index 30b68211695..843fec68271 100644 --- a/src/web/wcs/pom.xml +++ b/src/web/wcs/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/wfs/pom.xml b/src/web/wfs/pom.xml index 76123ffa7cc..6823b791867 100644 --- a/src/web/wfs/pom.xml +++ b/src/web/wfs/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/web/wms/pom.xml b/src/web/wms/pom.xml index f470f740d5d..13db9392cd5 100644 --- a/src/web/wms/pom.xml +++ b/src/web/wms/pom.xml @@ -11,7 +11,7 @@ org.geoserver web - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver.web diff --git a/src/wfs/pom.xml b/src/wfs/pom.xml index fac49cad6f8..e4ba304c88a 100644 --- a/src/wfs/pom.xml +++ b/src/wfs/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver diff --git a/src/wms/pom.xml b/src/wms/pom.xml index 8f1a0ceca9c..f6cc31e7569 100644 --- a/src/wms/pom.xml +++ b/src/wms/pom.xml @@ -10,7 +10,7 @@ org.geoserver geoserver - 2.24-SNAPSHOT + 2.25-SNAPSHOT org.geoserver From e2c0f3c2c3bf5e733d45b6c0040aef7a8b3ef2b0 Mon Sep 17 00:00:00 2001 From: Sebastian Frey Date: Fri, 22 Sep 2023 19:30:39 +0200 Subject: [PATCH 10/34] [GEOS-11077] Implement Requirement Class "Search" from OGC API - Features Part 5 proposal (#7040) * [GEOS-11077] Implement search resource * [GEOS-11077] Introduce static SortBy converter * [GEOS-11077] Polish shared search query bean * [GEOS-11077] Implement missing tests * [GEOS-11077] Document search endpoint * [GEOS-11077] Fix openapi.yaml * [GEOS-11077] Fix failing FeatureTests * [GEOS-11077] Fix package path * [GEOS-11077] Fix landing page test * [GEOS-11077] Fix landing page test for tiled-features plugin --- .../org/geoserver/ogcapi/APISearchQuery.java | 168 ++++++++++++ .../org/geoserver/ogcapi/SortByConverter.java | 15 +- .../ogcapi/v1/features/FeatureService.java | 31 +++ .../geoserver/ogcapi/v1/features/openapi.yaml | 202 ++++++++++++++ .../ogcapi/v1/features/FeatureTest.java | 248 ++++++++++++++++-- .../ogcapi/v1/features/LandingPageTest.java | 1 + .../v1/features/tiled/LandingPageTest.java | 1 + .../ogcapi/v1/stac/STACSearchQuery.java | 49 ++++ .../geoserver/ogcapi/v1/stac/STACService.java | 10 +- .../geoserver/ogcapi/v1/stac/SearchQuery.java | 95 ------- .../geoserver/ogcapi/v1/stac/SearchTest.java | 20 ++ 11 files changed, 713 insertions(+), 127 deletions(-) create mode 100644 src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java create mode 100644 src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACSearchQuery.java delete mode 100644 src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/SearchQuery.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java b/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java new file mode 100644 index 00000000000..a983f3179f2 --- /dev/null +++ b/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java @@ -0,0 +1,168 @@ +/* (c) 2023 Open Source Geospatial Foundation - all rights reserved + * This code is licensed under the GPL 2.0 license, available at the root + * application directory. + */ +package org.geoserver.ogcapi; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.ImmutableList; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import org.geotools.api.filter.sort.SortBy; + +/** Represents a search query used in POST requests */ +public class APISearchQuery { + + private BigInteger limit; + private BigInteger startIndex; + private String crs; + private String bbox; + + @JsonProperty("bbox-crs") + private String bboxCRS; + + private String datetime; + private List ids; + private SortBy[] sortBy; + private String filter; + + @JsonProperty("filter-crs") + private String filterCRS; + + @JsonProperty("filter-lang") + private String filterLang; + + public BigInteger getLimit() { + return limit; + } + + public void setLimit(BigInteger limit) { + this.limit = limit; + } + + public BigInteger getStartIndex() { + return startIndex; + } + + public void setStartIndex(BigInteger startIndex) { + this.startIndex = startIndex; + } + + public String getCrs() { + return crs; + } + + public void setCrs(String crs) { + this.crs = crs; + } + + public String getBbox() { + return bbox; + } + + // support passing bbox as array and as string + public void setBbox(JsonNode node) { + if (node instanceof ArrayNode) { + this.bbox = arrayNodeToString((ArrayNode) node); + } else { + this.bbox = node.textValue(); + } + } + + public String getDatetime() { + return datetime; + } + + public void setDatetime(String datetime) { + this.datetime = datetime; + } + + public String getBboxCRS() { + return bboxCRS; + } + + public void setBboxCRS(String bboxCRS) { + this.bboxCRS = bboxCRS; + } + + public List getIds() { + return ids; + } + + public void setIds(JsonNode node) { + if (node instanceof ArrayNode) { + this.ids = arrayNodeToStringList((ArrayNode) node); + return; + } + + String value = node.textValue(); + if (value == null) { + return; + } + this.ids = ImmutableList.copyOf(value.split(",")); + } + + public SortBy[] getSortBy() { + return sortBy; + } + + public void setSortBy(JsonNode node) { + if (node instanceof ArrayNode) { + List sortBy = arrayNodeToStringList((ArrayNode) node); + this.sortBy = SortByConverter.convertList(sortBy); + return; + } + this.sortBy = SortByConverter.convertString(node.textValue()); + } + + public String getFilter() { + return filter; + } + + // Using JsonNode to prevent Jackson from trying to parse into object if is CQL2-JSON + public void setFilter(JsonNode node) { + if (node instanceof ObjectNode) { + this.filter = node.toString(); + return; + } + this.filter = node.textValue(); + } + + public String getFilterLang() { + return filterLang; + } + + public void setFilterLang(String filterLang) { + this.filterLang = filterLang; + } + + public String getFilterCRS() { + return filterCRS; + } + + public void setFilterCRS(String filterCRS) { + this.filterCRS = filterCRS; + } + + private List arrayNodeToStringList(ArrayNode node) { + final List values = new ArrayList<>(node.size()); + node.forEach( + childNode -> { + if (childNode.isTextual()) { + values.add(childNode.textValue()); + } else { + values.add(childNode.toString()); + } + }); + return values; + } + + private String arrayNodeToString(ArrayNode node) { + return arrayNodeToStringList(node).stream().collect(Collectors.joining(",")); + } +} diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java b/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java index 8a0a1cefee4..e19e14ed6e6 100644 --- a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java +++ b/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java @@ -5,6 +5,7 @@ package org.geoserver.ogcapi; import java.util.Arrays; +import java.util.List; import org.geotools.api.filter.FilterFactory; import org.geotools.api.filter.sort.SortBy; import org.geotools.api.filter.sort.SortOrder; @@ -22,14 +23,17 @@ public class SortByConverter implements Converter { static final FilterFactory FF = CommonFactoryFinder.getFilterFactory(); - @Override - public SortBy[] convert(String spec) { + public static final SortBy[] convertList(List sortBy) { + return sortBy.stream().map(s -> sortBy(s)).toArray(n -> new SortBy[n]); + } + + public static final SortBy[] convertString(String spec) { return Arrays.stream(spec.split("\\s*,\\s*")) .map(s -> sortBy(s)) .toArray(n -> new SortBy[n]); } - private SortBy sortBy(String spec) { + private static SortBy sortBy(String spec) { SortOrder order = SortOrder.ASCENDING; if (spec.startsWith("+")) { spec = spec.substring(1); @@ -39,4 +43,9 @@ private SortBy sortBy(String spec) { } return FF.sort(spec, order); } + + @Override + public SortBy[] convert(String spec) { + return convertString(spec); + } } diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java b/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java index 6da04de4be4..f8ae6c6597f 100644 --- a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java +++ b/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java @@ -48,6 +48,7 @@ import org.geoserver.ogcapi.APIException; import org.geoserver.ogcapi.APIFilterParser; import org.geoserver.ogcapi.APIRequestInfo; +import org.geoserver.ogcapi.APISearchQuery; import org.geoserver.ogcapi.APIService; import org.geoserver.ogcapi.ConformanceDocument; import org.geoserver.ogcapi.DefaultContentType; @@ -84,6 +85,8 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -435,6 +438,34 @@ public FeaturesResponse items( return new FeaturesResponse(request.getAdaptee(), response); } + @PostMapping(path = "collections/{collectionId}/search", name = "searchFeatures") + @ResponseBody + @DefaultContentType(OGCAPIMediaTypes.GEOJSON_VALUE) + public FeaturesResponse search( + @PathVariable(name = "collectionId") String collectionId, + @RequestBody APISearchQuery query) + throws Exception { + + // WARNING: + // This endpoint is part of the draft proposal "OGC API - Features - Part 5". The syntax and + // semantic of the endpoint is subject to change in a future release. Its usage should be + // carefully considered. + return items( + collectionId, + query.getStartIndex(), + query.getLimit(), + query.getBbox(), + query.getBboxCRS(), + query.getDatetime(), + query.getFilter(), + query.getFilterLang(), + query.getFilterCRS(), + query.getSortBy(), + query.getCrs(), + query.getIds(), + null); + } + /** TODO: use DimensionInfo instead? It's used to return the time range in the collection */ private Filter buildTimeFilter(FeatureTypeInfo ft, String time) throws ParseException, IOException { diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml b/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml index c4557b490f1..06702bc760a 100644 --- a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml +++ b/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml @@ -178,6 +178,34 @@ paths: $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/ServerError' + '/collections/{collectionId}/search': + post: + tags: + - Data + summary: search features + description: |- + Retrieve items matching filters using POST. + + WARNING: + + This endpoint is part of the draft proposal "OGC API - Features - Part 5". The syntax and + semantic of the endpoint is subject to change in a future release. Its usage should be + carefully considered. + operationId: searchFeatures + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/searchBody' + responses: + '200': + $ref: '#/components/responses/Features' + '400': + $ref: '#/components/responses/InvalidParameter' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' '/collections/{collectionId}/items/{featureId}': get: tags: @@ -860,7 +888,181 @@ components: type: string format: date-time example: '2017-08-17T08:05:32Z' + searchBody: + allOf: + - $ref: '#/components/schemas/limitFilter' + - $ref: '#/components/schemas/bboxFilter' + - $ref: '#/components/schemas/bboxCrsFilter' + - $ref: '#/components/schemas/crsFilter' + - $ref: '#/components/schemas/datetimeFilter' + - $ref: '#/components/schemas/idsFilter' + - $ref: '#/components/schemas/sortByFilter' + - $ref: '#/components/schemas/filterFilter' + - $ref: '#/components/schemas/filterCrsFilter' + - $ref: '#/components/schemas/filterLangFilter' + description: The search criteria + type: object + limit: + name: limit + description: |- + The optional limit parameter limits the number of items that are presented in the response document. + + Only items are counted that are on the first level of the collection in the response document. + Nested objects contained within the explicitly requested items shall not be counted. + + Minimum = 1. Maximum = 10000. Default = 10. + type: integer + minimum: 1 + maximum: 10000 + default: 10 + limitFilter: + properties: + limit: + $ref: '#/components/schemas/limit' + type: object + bbox: + name: bbox + in: query + description: |- + Only features that have a geometry that intersects the bounding box are selected. + The bounding box is provided as four or six numbers, depending on whether the + coordinate reference system includes a vertical axis (height or depth): + + * Lower left corner, coordinate axis 1 + * Lower left corner, coordinate axis 2 + * Minimum value, coordinate axis 3 (optional) + * Upper right corner, coordinate axis 1 + * Upper right corner, coordinate axis 2 + * Maximum value, coordinate axis 3 (optional) + + The coordinate reference system of the values is WGS 84 longitude/latitude + (http://www.opengis.net/def/crs/OGC/1.3/CRS84) unless a different coordinate + reference system is specified in the parameter `bbox-crs`. + For WGS 84 longitude/latitude the values are in most cases the sequence of + minimum longitude, minimum latitude, maximum longitude and maximum latitude. + However, in cases where the box spans the antimeridian the first value + (west-most box edge) is larger than the third value (east-most box edge). + + If the vertical axis is included, the third and the sixth number are + the bottom and the top of the 3-dimensional bounding box. + + If a feature has multiple spatial geometry properties, it is the decision of the + server whether only a single spatial geometry property is used to determine + the extent or all relevant geometries. + type: array + minItems: 4 + maxItems: 6 + items: + type: number + bboxFilter: + properties: + bbox: + $ref: '#/components/schemas/bbox' + type: object + bboxCrs: + name: bbox-crs + type: string + bboxCrsFilter: + properties: + bboxCrs: + $ref: '#/components/schemas/bboxCrs' + type: object + crs: + name: crs + type: string + format: uri + crsFilter: + properties: + crs: + $ref: '#/components/schemas/crs' + type: object + datetime: + name: datetime + description: |- + Either a date-time or an interval, open or closed. Date and time expressions + adhere to RFC 3339. Open intervals are expressed using double-dots. + + Examples: + + * A date-time: "2018-02-12T23:20:50Z" + * A closed interval: "2018-02-12T00:00:00Z/2018-03-18T12:31:12Z" + * Open intervals: "2018-02-12T00:00:00Z/.." or "../2018-03-18T12:31:12Z" + + Only features that have a temporal property that intersects the value of + `datetime` are selected. + + If a feature has multiple temporal properties, it is the decision of the + server whether only a single temporal property is used to determine + the extent or all relevant temporal properties. + type: string + datetimeFilter: + properties: + datetime: + $ref: '#/components/schemas/datetime' + type: object + filter: + name: filter + description: Defines a filter that will be applied on items, only items matching the filter will be returned + type: string + filterFilter: + properties: + filter: + $ref: '#/components/schemas/filter' + type: object + filterLang: + name: filter-lang + description: Filter encoding used in the filter parameter + type: string + enum: + - cql-text + - cql2-text + default: cql-text + filterLangFilter: + properties: + filterLang: + $ref: '#/components/schemas/filterLang' + type: object + filterCrs: + name: filter-crs + description: Filter CRS which is being used to encode geometries in the filter parameter + type: string + format: uri-reference + filterCrsFilter: + properties: + filterCrs: + $ref: '#/components/schemas/filterCrs' + type: object + sortBy: + name: sortby + description: Defines how features in a response should be ordered for presentation. + type: array + minItems: 1 + items: + type: string + pattern: '[+|-]?[A-Za-z_].*' + sortByFilter: + properties: + sortBy: + $ref: '#/components/schemas/sortBy' + type: object + ids: + name: ids + description: |- + Query multiple items by ID. + + WARNING: + + The parameter is part of the draft proposal "Query by IDs". The syntax and semantic of the + parameter is subject to change in a future release. Its usage should be carefully considered. + type: array + items: + type: string + idsFilter: + properties: + ids: + $ref: '#/components/schemas/ids' + type: object functions: type: object required: diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java b/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java index 7e1e800df44..f612c8f0263 100644 --- a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java +++ b/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java @@ -190,17 +190,23 @@ public void testBBoxCRSFilter() throws Exception { } private String bboxCrsQueryParameters(ReferencedEnvelope re) throws FactoryException { - String boxValue = - re.getMinX() + "," + re.getMinY() + "," + re.getMaxX() + "," + re.getMaxY(); - String crsValue = - CRS.equalsIgnoreMetadata( - re.getCoordinateReferenceSystem(), DefaultGeographicCRS.WGS84) - ? FeatureService.DEFAULT_CRS - : FeatureService.CRS_PREFIX - + CRS.lookupEpsgCode(re.getCoordinateReferenceSystem(), true); + String boxValue = bboxQueryParameter(re); + String crsValue = crsQueryParameter(re); return "bbox=" + boxValue + "&bbox-crs=" + crsValue; } + private String bboxQueryParameter(ReferencedEnvelope re) { + return re.getMinX() + "," + re.getMinY() + "," + re.getMaxX() + "," + re.getMaxY(); + } + + private String crsQueryParameter(ReferencedEnvelope re) throws FactoryException { + return CRS.equalsIgnoreMetadata( + re.getCoordinateReferenceSystem(), DefaultGeographicCRS.WGS84) + ? FeatureService.DEFAULT_CRS + : FeatureService.CRS_PREFIX + + CRS.lookupEpsgCode(re.getCoordinateReferenceSystem(), true); + } + @Test public void testBBOXOGCAuthority() throws Exception { String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); @@ -310,7 +316,7 @@ public void testCql2JsonSpatialFilter() throws Exception { getAsJSONPath( "ogc/features/v1/collections/" + roadSegments - + "/items?filter=%7B%22op%22%3A%22s_intersects%22%2C%22args%22%3A%5B%7B%22property%22%3A%22pointProperty%22%7D%2C%7B%22bbox%22%3A%5B38%2C1%2C40%2C3%5D%7D%5D%7D" // {"op":"s_intersects","args":[{"property":"pointProperty"},{"bbox":[38,1,40,3]}]} + + "/items?filter=%7B%22op%22%3A%22s_intersects%22%2C%22args%22%3A%5B%7B%22property%22%3A%22pointProperty%22%7D%2C%7B%22bbox%22%3A%5B38%2C1%2C40%2C3%5D%7D%5D%7D" // + "&filter-lang=cql2-json", 200); assertEquals("FeatureCollection", json.read("type", String.class)); @@ -341,22 +347,8 @@ public void testCqlSpatialFilterWithFilterCrs() throws Exception { } private String filterCrsQueryParameters(ReferencedEnvelope re) throws FactoryException { - String boxValue = - "BBOX(pointProperty," - + re.getMinX() - + "," - + re.getMinY() - + "," - + re.getMaxX() - + "," - + re.getMaxY() - + ")"; - String crsValue = - CRS.equalsIgnoreMetadata( - re.getCoordinateReferenceSystem(), DefaultGeographicCRS.WGS84) - ? FeatureService.DEFAULT_CRS - : FeatureService.CRS_PREFIX - + CRS.lookupEpsgCode(re.getCoordinateReferenceSystem(), true); + String boxValue = "BBOX(pointProperty," + bboxQueryParameter(re) + ")"; + String crsValue = crsQueryParameter(re); return "filter=" + boxValue + "&filter-crs=" + crsValue + "&filter-lang=cql-text"; } @@ -533,6 +525,212 @@ public void testIdsFilter() throws Exception { assertEquals("RoadSegments.1107532045091", json.read("features[1].id", String.class)); } + @Test + public void testSearchCql2JsonFilter() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = + "{\n" + + " \"filter\": {\"op\":\"=\",\"args\":[{\"property\":\"name\"},\"name-f001\"]}," + + " \"filter-lang\": \"cql2-json\"\n" + + "}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f001 + assertEquals(1, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + } + + @Test + public void testSearchCql2TextFilter() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = + "{\n" + + " \"filter\": \"BBOX(pointProperty,38,1,40,3)\",\n" + + " \"filter-lang\": \"cql-text\"\n" + + "}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f001 + assertEquals(1, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + } + + @Test + public void testSearchCql2TextFilterWithFilterCrs() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + ReferencedEnvelope bbox = new ReferencedEnvelope(38, 40, 1, 3, DefaultGeographicCRS.WGS84); + ReferencedEnvelope wmBox = bbox.transform(CRS.decode("EPSG:3857", true), true); + String crsValue = crsQueryParameter(wmBox); + + String request = + "{\n" + + " \"filter\": \"BBOX(pointProperty," + + bboxQueryParameter(wmBox) + + ")\",\n" + + " \"filter-lang\": \"cql-text\"\n," + + " \"filter-crs\": \"" + + crsValue + + "\"\n}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f001 + assertEquals(1, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + } + + @Test + public void testSearchBBoxJsonFilter() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = "{\"bbox\":[35, 0, 60, 3]}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f002 and f003 + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f002')]", List.class).size()); + } + + @Test + public void testSearchBBoxTextFilter() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = "{\"bbox\":\"35,0,60,3\"}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f002 and f003 + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f002')]", List.class).size()); + } + + @Test + public void testSearchBBoxCRSFilter() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + ReferencedEnvelope bbox = new ReferencedEnvelope(35, 60, 0, 3, DefaultGeographicCRS.WGS84); + ReferencedEnvelope wmBox = bbox.transform(CRS.decode("EPSG:3857", true), true); + String boxValue = bboxQueryParameter(wmBox); + String bboxCrsValue = crsQueryParameter(wmBox); + String request = "{\"bbox\":\"" + boxValue + "\",\"bbox-crs\":\"" + bboxCrsValue + "\"}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f002 and f003 + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f002')]", List.class).size()); + } + + @Test + public void testSearchCRSFilter() throws Exception { + String roadSegments = ResponseUtils.urlEncode(getLayerId(MockData.ROAD_SEGMENTS)); + String crs = FeatureService.CRS_PREFIX + "3857"; + String request = "{\"crs\":\"" + crs + "\"}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + + assertEquals("FeatureCollection", json.read("type", String.class)); + assertEquals(5, (int) json.read("features.length()", Integer.class)); + // get ordinates of RoadSegments.1107532045091, returns array[array[array[double]]] + List>> result = + readSingle( + json, + "features[?(@.id=='RoadSegments.1107532045091')].geometry.coordinates"); + // original feature: + // RoadSegments.1107532045091=MULTILINESTRING ((-0.0014 -0.0024, -0.0014 0.0002))| + // 106|Dirt Road by Green Forest + List ordinate0 = result.get(0).get(0); + List ordinate1 = result.get(0).get(1); + assertThat(ordinate0, contains(closeTo(-156, 1), closeTo(-267, 1))); + assertThat(ordinate1, contains(closeTo(-156, 1), closeTo(22, 1))); + } + + @Test + public void testSearchIdsJsonFilter() throws Exception { + String roadSegments = getLayerId(MockData.ROAD_SEGMENTS); + String request = + "{\"ids\":[\"RoadSegments.1107532045088\",\"RoadSegments.1107532045091\"]}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals("RoadSegments.1107532045088", json.read("features[0].id", String.class)); + assertEquals("RoadSegments.1107532045091", json.read("features[1].id", String.class)); + } + + @Test + public void testSearchIdsTextFilter() throws Exception { + String roadSegments = getLayerId(MockData.ROAD_SEGMENTS); + String request = "{\"ids\":\"RoadSegments.1107532045088,RoadSegments.1107532045091\"}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals("RoadSegments.1107532045088", json.read("features[0].id", String.class)); + assertEquals("RoadSegments.1107532045091", json.read("features[1].id", String.class)); + } + + @Test + public void testSearchDatetimeFilter() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = "{\"datetime\":\"2006-10-25\"}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + // should return only f001 + assertEquals(1, (int) json.read("features.length()", Integer.class)); + assertEquals( + 1, json.read("features[?(@.id == 'PrimitiveGeoFeature.f001')]", List.class).size()); + } + + @Test + public void testSearchSortByJson() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = "{\"sortBy\":[\"name\"],\"limit\":2}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals(null, json.read("features[0].properties.name", String.class)); + assertEquals("name-f001", json.read("features[1].properties.name", String.class)); + } + + @Test + public void testSearchSortByText() throws Exception { + String roadSegments = getLayerId(MockData.PRIMITIVEGEOFEATURE); + String request = "{\"sortBy\":\"name\",\"limit\":2}"; + DocumentContext json = + postAsJSONPath( + "ogc/features/v1/collections/" + roadSegments + "/search", request, 200); + assertEquals("FeatureCollection", json.read("type", String.class)); + assertEquals(2, (int) json.read("features.length()", Integer.class)); + assertEquals(null, json.read("features[0].properties.name", String.class)); + assertEquals("name-f001", json.read("features[1].properties.name", String.class)); + } + @Test public void testSingleFeatureAsGeoJson() throws Exception { String roadSegments = getLayerId(MockData.ROAD_SEGMENTS); diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java b/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java index 2d61e54f6eb..784c5a75d7b 100644 --- a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java +++ b/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java @@ -40,6 +40,7 @@ public void testServiceDescriptor() { "getConformanceDeclaration", "getFeature", "getFeatures", + "searchFeatures", "getLandingPage", "getQueryables", "getFunctions", diff --git a/src/community/ogcapi/ogcapi-tiled-features/src/test/java/org/geoserver/ogcapi/v1/features/tiled/LandingPageTest.java b/src/community/ogcapi/ogcapi-tiled-features/src/test/java/org/geoserver/ogcapi/v1/features/tiled/LandingPageTest.java index c32860a4962..a592a4c8203 100644 --- a/src/community/ogcapi/ogcapi-tiled-features/src/test/java/org/geoserver/ogcapi/v1/features/tiled/LandingPageTest.java +++ b/src/community/ogcapi/ogcapi-tiled-features/src/test/java/org/geoserver/ogcapi/v1/features/tiled/LandingPageTest.java @@ -37,6 +37,7 @@ public void testServiceDescriptor() { "getConformanceDeclaration", "getFeature", "getFeatures", + "searchFeatures", "getLandingPage", "getQueryables", "getFunctions", diff --git a/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACSearchQuery.java b/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACSearchQuery.java new file mode 100644 index 00000000000..6ec1050f25f --- /dev/null +++ b/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACSearchQuery.java @@ -0,0 +1,49 @@ +/* (c) 2021 Open Source Geospatial Foundation - all rights reserved + * This code is licensed under the GPL 2.0 license, available at the root + * application directory. + */ +package org.geoserver.ogcapi.v1.stac; + +import java.math.BigInteger; +import java.util.List; +import org.geoserver.ogcapi.APISearchQuery; +import org.locationtech.jts.geom.Geometry; + +/** Represents a STAC query used in POST requests */ +public class STACSearchQuery extends APISearchQuery { + + private List collections; + Geometry intersects; + + public List getCollections() { + return collections; + } + + public void setCollections(List collections) { + this.collections = collections; + } + + public Geometry getIntersects() { + return intersects; + } + + public void setIntersects(Geometry intersects) { + this.intersects = intersects; + } + + public Integer getLimitAsInt() { + BigInteger limit = getLimit(); + if (limit == null) { + return null; + } + return limit.intValue(); + } + + public Integer getStartIndexAsInt() { + BigInteger startIndex = getStartIndex(); + if (startIndex == null) { + return null; + } + return startIndex.intValue(); + } +} diff --git a/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACService.java b/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACService.java index 4c470ea959d..2fc586acedf 100644 --- a/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACService.java +++ b/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/STACService.java @@ -461,7 +461,7 @@ public SearchResponse searchGet( @PostMapping(path = "search", name = "searchPost") @ResponseBody @DefaultContentType(OGCAPIMediaTypes.GEOJSON_VALUE) - public SearchResponse searchPost(@RequestBody SearchQuery sq) throws Exception { + public SearchResponse searchPost(@RequestBody STACSearchQuery sq) throws Exception { QueryResultBuilder resultBuilder = new QueryResultBuilder( @@ -469,8 +469,8 @@ public SearchResponse searchPost(@RequestBody SearchQuery sq) throws Exception { resultBuilder .collectionIds(sq.getCollections()) .intersects(sq.getIntersects()) - .startIndex(sq.getStartIndex()) - .requestedLimit(sq.getLimit()) + .startIndex(sq.getStartIndexAsInt()) + .requestedLimit(sq.getLimitAsInt()) .bbox(sq.getBbox()) .datetime(sq.getDatetime()) .filter(sq.getFilter()) @@ -487,7 +487,9 @@ public SearchResponse searchPost(@RequestBody SearchQuery sq) throws Exception { PaginationLinksBuilder linksBuilder = new PaginationLinksBuilder( path, - Optional.ofNullable(sq.getStartIndex()).orElse(0), + Optional.ofNullable(sq.getStartIndex()) + .orElse(BigInteger.valueOf(0)) + .longValue(), qr.getQuery().getMaxFeatures(), qr.getReturned(), qr.getNumberMatched().longValue()); diff --git a/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/SearchQuery.java b/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/SearchQuery.java deleted file mode 100644 index 792e5c186b8..00000000000 --- a/src/community/oseo/oseo-stac/src/main/java/org/geoserver/ogcapi/v1/stac/SearchQuery.java +++ /dev/null @@ -1,95 +0,0 @@ -/* (c) 2021 Open Source Geospatial Foundation - all rights reserved - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - */ -package org.geoserver.ogcapi.v1.stac; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import java.util.List; -import org.locationtech.jts.geom.Geometry; - -/** Represents a STAC query used in POST requests */ -public class SearchQuery { - - private List collections; - private double[] bbox; - private Integer limit; - private String datetime; - private String filter; - private Integer startIndex; - Geometry intersects; - - @JsonProperty("filter-lang") - String filterLang; - - public List getCollections() { - return collections; - } - - public void setCollections(List collections) { - this.collections = collections; - } - - public double[] getBbox() { - return bbox; - } - - public void setBbox(double[] bbox) { - this.bbox = bbox; - } - - public Integer getLimit() { - return limit; - } - - public void setLimit(Integer limit) { - this.limit = limit; - } - - public String getDatetime() { - return datetime; - } - - public void setDatetime(String datetime) { - this.datetime = datetime; - } - - public String getFilter() { - return filter; - } - - // Using JsonNode to prevent Jackson from trying to parse into object if is CQL2-JSON - public void setFilter(JsonNode node) { - if (node instanceof ObjectNode) { - this.filter = node.toString(); - } else { - this.filter = node.textValue(); - } - } - - public String getFilterLang() { - return filterLang; - } - - public void setFilterLang(String filterLang) { - this.filterLang = filterLang; - } - - public Integer getStartIndex() { - return startIndex; - } - - public void setStartIndex(Integer startIndex) { - this.startIndex = startIndex; - } - - public Geometry getIntersects() { - return intersects; - } - - public void setIntersects(Geometry intersects) { - this.intersects = intersects; - } -} diff --git a/src/community/oseo/oseo-stac/src/test/java/org/geoserver/ogcapi/v1/stac/SearchTest.java b/src/community/oseo/oseo-stac/src/test/java/org/geoserver/ogcapi/v1/stac/SearchTest.java index ad77d6b91ad..9e0ddc1ccbe 100644 --- a/src/community/oseo/oseo-stac/src/test/java/org/geoserver/ogcapi/v1/stac/SearchTest.java +++ b/src/community/oseo/oseo-stac/src/test/java/org/geoserver/ogcapi/v1/stac/SearchTest.java @@ -236,6 +236,26 @@ public void testBBOXFilterPost() throws Exception { "JSONB_TEST.02")); } + @Test + public void testBBOXAsTextFilterPost() throws Exception { + // two sentinel, one landsat, one sas + String request = "{\"bbox\":\"16,42,17,43\"}"; + DocumentContext doc = postAsJSONPath("ogc/stac/v1/search", request, 200); + + checkCollectionsItemsSinglePage( + doc, + 6, + containsInAnyOrder( + "LANDSAT8", "LANDSAT8", "SAS1", "SAS1", "SENTINEL2", "SENTINEL2"), + containsInAnyOrder( + "S2A_OPER_MSI_L1C_TL_SGS__20160117T141030_A002979_T33TWG_N02.01", + "S2A_OPER_MSI_L1C_TL_SGS__20160117T141030_A002979_T33TWH_N02.01", + "LS8_TEST.02", + "SAS1_20180226102021.01", + "SAS1_20180227102021.02", + "JSONB_TEST.02")); + } + public void checkCollectionsItemsSinglePage( DocumentContext doc, int matched, From c079a3049bd1897893c95ac4200c83b2db52185b Mon Sep 17 00:00:00 2001 From: Jody Garnett Date: Fri, 22 Sep 2023 19:15:24 -0700 Subject: [PATCH 11/34] [GEOS-11132] Updating printing plugin to mapfish-print-lib 2.3-RC Update to the mapfish-print-lib 2.3-RC release candidate. This reflects the refacoring to GeoTools 30-RC. --- src/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pom.xml b/src/pom.xml index 43dee2adecf..76ee2ba5743 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -124,7 +124,7 @@ false true 3.7-RC - 2.3-SNAPSHOT + 2.3-RC 1.9.2 3.6.9.Final 1.1.0 From 4b465f2c18cc6d6d518394085ed155e1870094fb Mon Sep 17 00:00:00 2001 From: Peter Smythe Date: Sat, 23 Sep 2023 12:52:25 +0200 Subject: [PATCH 12/34] Update checkout.txt (#7125) Fix spelling --- doc/en/developer/source/quickstart/checkout.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/en/developer/source/quickstart/checkout.txt b/doc/en/developer/source/quickstart/checkout.txt index 28b2b92c7c1..a6fa526c6ed 100644 --- a/doc/en/developer/source/quickstart/checkout.txt +++ b/doc/en/developer/source/quickstart/checkout.txt @@ -16,7 +16,7 @@ Choose ``main`` for the latest development.:: % git checkout main -Or chose a stable branch for versions less likely to change often:: +Or choose a stable branch for versions less likely to change often:: % git checkout 2.22.x From 7cb95d22f53f58adb86dd548d5f2bc4d8a2146e5 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Sat, 23 Sep 2023 16:43:01 +0200 Subject: [PATCH 13/34] Revert javadoc maven plugin upgrade, add build to ensure aggregate works --- .github/workflows/javadoc.yml | 49 +++++++++++++++++++++++++++++++++++ src/pom.xml | 6 ++--- 2 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/javadoc.yml diff --git a/.github/workflows/javadoc.yml b/.github/workflows/javadoc.yml new file mode 100644 index 00000000000..8629e72d0e1 --- /dev/null +++ b/.github/workflows/javadoc.yml @@ -0,0 +1,49 @@ +name: Linux JDK 11 GitHub CI + +on: + pull_request: + paths-ignore: + - '**/src/main/resources/GeoServerApplication_*.properties' + - '!**/src/main/resources/GeoServerApplication_fr.properties' + +env: + MAVEN_OPTS: -Dmaven.wagon.httpconnectionManager.ttlSeconds=25 -Dmaven.wagon.http.retryHandler.count=3 -Xmx512m -Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS + +jobs: + javadoc: + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-20.04 + jdk: 11 + dist: 'temurin' + steps: + - uses: actions/checkout@v2 + with: + # 500 commits, set to 0 to get all + fetch-depth: 500 + - name: Set up JDK + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.jdk }} + distribution: ${{ matrix.dist }} + - name: Set up Maven + uses: stCarolas/setup-maven@v4 + with: + maven-version: 3.8.4 + - name: Maven repository caching + uses: actions/cache@v2 + with: + path: ~/.m2/repository + key: gs-${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + gs-${{ runner.os }}-maven- + - name: Build with Maven + run: mvn -B -fae -Dspotless.apply.skip=true -f src/pom.xml clean install -DskipTests + - name: Build aggregate javadocs + run: mvn -B -fae -Dspotless.apply.skip=true -f src/pom.xml javadoc:aggregate + - name: Remove SNAPSHOT jars from repository + run: | + find ~/.m2/repository -name "*SNAPSHOT*" -type d | xargs rm -rf {} + diff --git a/src/pom.xml b/src/pom.xml index 76ee2ba5743..58b4a9940e9 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -1718,7 +1718,7 @@ maven-javadoc-plugin - 3.5.0 + 2.10.3 maven-resources-plugin @@ -2006,10 +2006,10 @@ - http://docs.oracle.com/javase/8/docs/api/ + https://docs.oracle.com/en/java/javase/11/docs/api http://docs.oracle.com/javaee/7/api/ http://jscience.org/api/ - http://tsusiatsoftware.net/jts/javadoc + https://locationtech.github.io/jts/javadoc/ http://docs.geotools.org/latest/javadocs/ http://xmlgraphics.apache.org/batik/javadoc http://freemarker.sourceforge.net/docs/api/ From fd2e160f75dfc0228fbb987549367907c9a38077 Mon Sep 17 00:00:00 2001 From: Peter Smythe Date: Sat, 23 Sep 2023 21:50:06 +0200 Subject: [PATCH 14/34] [GEOS-11130] Add a new role > parent role dropdown is not in any discernable order --- .../org/geoserver/security/web/role/AbstractRolePage.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/web/security/core/src/main/java/org/geoserver/security/web/role/AbstractRolePage.java b/src/web/security/core/src/main/java/org/geoserver/security/web/role/AbstractRolePage.java index a728270469b..c444448d6f4 100644 --- a/src/web/security/core/src/main/java/org/geoserver/security/web/role/AbstractRolePage.java +++ b/src/web/security/core/src/main/java/org/geoserver/security/web/role/AbstractRolePage.java @@ -127,6 +127,7 @@ List computeAllowableParentRoles(GeoServerRole role) throws IOException // if no parent mappings, return empty list if (parentMappings == null || parentMappings.isEmpty()) return Collections.emptyList(); + List parentRoles; if (role != null && StringUtils.hasLength(role.getAuthority())) { // filter out roles already used as parents RoleHierarchyHelper helper = new RoleHierarchyHelper(parentMappings); @@ -134,12 +135,14 @@ List computeAllowableParentRoles(GeoServerRole role) throws IOException Set parents = new HashSet<>(parentMappings.keySet()); parents.removeAll(helper.getDescendants(role.getAuthority())); parents.remove(role.getAuthority()); - return new ArrayList<>(parents); + parentRoles = new ArrayList<>(parents); } else { // no rolename given, we are creating a new one - return new ArrayList<>(parentMappings.keySet()); + parentRoles = new ArrayList<>(parentMappings.keySet()); } + Collections.sort(parentRoles); + return parentRoles; } @Override From 8cbf7febe6d07d02c6134c9e67bbc3ed35a4b67a Mon Sep 17 00:00:00 2001 From: Peter Rushforth Date: Wed, 27 Sep 2023 14:58:51 -0400 Subject: [PATCH 15/34] Update viewer to 0.12.0. Update docs with perf warning post 2.22.x --- doc/en/user/source/extensions/mapml/index.rst | 1 + .../resources/viewer/widget/DOMTokenList.js | 17 +------ .../viewer/widget/DOMTokenList.js.map | 2 +- .../main/resources/viewer/widget/README.md | 46 +++++++++++++++++++ .../src/main/resources/viewer/widget/layer.js | 19 ++------ .../main/resources/viewer/widget/layer.js.map | 2 +- .../main/resources/viewer/widget/leaflet.js | 34 +------------- .../resources/viewer/widget/leaflet.js.map | 2 +- .../main/resources/viewer/widget/map-area.js | 19 ++------ .../resources/viewer/widget/map-area.js.map | 2 +- .../resources/viewer/widget/map-caption.js | 17 +------ .../viewer/widget/map-caption.js.map | 2 +- .../resources/viewer/widget/map-extent.js | 19 ++------ .../resources/viewer/widget/map-extent.js.map | 2 +- .../resources/viewer/widget/map-feature.js | 19 ++------ .../viewer/widget/map-feature.js.map | 2 +- .../resources/viewer/widget/mapml-viewer.js | 19 ++------ .../viewer/widget/mapml-viewer.js.map | 2 +- .../main/resources/viewer/widget/mapml.css | 4 +- .../src/main/resources/viewer/widget/mapml.js | 27 +++-------- .../main/resources/viewer/widget/mapml.js.map | 2 +- .../main/resources/viewer/widget/web-map.js | 19 ++------ .../resources/viewer/widget/web-map.js.map | 2 +- 23 files changed, 90 insertions(+), 190 deletions(-) diff --git a/doc/en/user/source/extensions/mapml/index.rst b/doc/en/user/source/extensions/mapml/index.rst index 60191f3fa05..47cea5d9626 100644 --- a/doc/en/user/source/extensions/mapml/index.rst +++ b/doc/en/user/source/extensions/mapml/index.rst @@ -6,6 +6,7 @@ MapML Map Markup Language (MapML) is a text-based format which allows map authors to encode map information as hypertext documents exchanged over the Uniform Interface of the Web. The format definition is still a work-in-progress by the Maps for HTML W3C Community Group, but various tools to work with the format already exist, including a Leaflet-based map viewer. For more information on MapML refer to the `Maps for HTML Community Group `. The MapML module for GeoServer adds new MapML resources to access WMS and WFS services configured in Geoserver. The MapML modules includes support for styles, tiling, querying, sharding, and dimensions options for WMS layers, and also provides a MapML outputFormat for WMS GetFeatureInfo and WFS GetFeatures requests. See below for information on installing and configuring the MapML module. + .. warning:: The MapML extension performance is negatively affected by a recent upgrade to Spring in the GeoServer project. This affects all versions since 2.22.0. To avoid serious performance penalty, please remove "text/.*" from the gzip filter in your web.xml servlet configuration. .. warning:: MapML is an experimental proposed extension of HTML for the Web. The objective of the format is to standardize map, layer and feature semantics in HTML. As the format progresses towards a Web standard, it may change. Always use the latest version of this extension, and follow the project's progress at https://maps4html.org. diff --git a/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js b/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js index c05c5212b02..6304fbdb743 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js +++ b/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js @@ -1,17 +1,4 @@ -/*! @maps4html/web-map-custom-element 28-04-2023 */ -/* (c) 2023 Open Source Geospatial Foundation - all rights reserved - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - * Copyright (c) 2023 Canada Centrre for Mapping and Earth Observation, Natural - * Resources Canada - * Copyright © 2023 World Wide Web Consortium, (Massachusetts Institute of Technology, - * European Research Consortium for Informatics and Mathematics, Keio - * University, Beihang). All Rights Reserved. This work is distributed under the - * W3C® Software License [1] in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. - * [1] http://www.w3.org/Consortium/Legal/copyright-software - * - */ +/*! @maps4html/web-map-custom-element 27-09-2023 */ + export default class DOMTokenList{#element;#valueSet;#attribute;#domain;constructor(t,e,i,s){var o=document.createElement("div");this.domtokenlist=o.classList,this.#valueSet=!1,this.domtokenlist.value=t??"",this.#element=e,this.#attribute=i,this.#domain=s}get valueSet(){return this.#valueSet}get length(){return this.domtokenlist.length}get value(){return this.domtokenlist.value}set value(t){null===t?this.domtokenlist.value="":(this.domtokenlist.value=t.toLowerCase(),this.#valueSet=!0,this.#element.setAttribute(this.#attribute,this.domtokenlist.value),this.#valueSet=!1)}item(t){return this.domtokenlist.item(t)}contains(t){return this.domtokenlist.contains(t)}add(t){this.domtokenlist.add(t),this.#element.setAttribute(this.#attribute,this.domtokenlist.value)}remove(t){this.domtokenlist.remove(t),this.#element.setAttribute(this.#attribute,this.domtokenlist.value)}replace(t,e){this.domtokenlist.replace(t,e),this.#element.setAttribute(this.#attribute,this.domtokenlist.value)}supports(t){return!!this.#domain.includes(t)}toggle(t,e){this.domtokenlist.toggle(t,e),this.#element.setAttribute(this.#attribute,this.domtokenlist.value)}entries(){return this.domtokenlist.entries()}forEach(t,e){this.domtokenlist.forEach(t,e)}keys(){return this.domtokenlist.keys()}values(){return this.domtokenlist.values()}} //# sourceMappingURL=DOMTokenList.js.map \ No newline at end of file diff --git a/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js.map b/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js.map index 89abf20b495..04e148208dc 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js.map +++ b/src/extension/mapml/src/main/resources/viewer/widget/DOMTokenList.js.map @@ -1 +1 @@ -{"version":3,"file":"DOMTokenList.js","sources":["../src/mapml/utils/DOMTokenList.js"],"sourcesContent":["export default class DOMTokenList {\n /* jshint ignore:start */\n\t#element; // create element as a private property\n\t#valueSet; // needed to prevent infinite recursive calls to CE setAttribute\n \t#attribute // the name of the attribute that will be a DOMTokenList\n \t#domain; // the domain of token values supported by this attribute\n /* jshint ignore:end */\n\tconstructor (initialValue, element, attribute, domain) {\n\t\t// create donor/host div to extract DomTokenList from\n\t\tconst hostingElement = document.createElement('div');\n\t\tthis.domtokenlist = hostingElement.classList;\n\t\t\n\t\t// to check if value is being set, protects from infinite recursion\n\t\t// from attributeChangedCallback of mapml-viewer and web-map\n\t\tthis.#valueSet = false;// jshint ignore:line\n\t\tthis.domtokenlist.value = initialValue ?? '';\n\t\tthis.#element = element;// jshint ignore:line\n \tthis.#attribute = attribute;// jshint ignore:line\n \tthis.#domain = domain;// jshint ignore:line\n\t}\n\t\n\tget valueSet () {\n\t\treturn this.#valueSet;// jshint ignore:line\n\t}\n\n\tget length () {\n\t\treturn this.domtokenlist.length;\n\t}\n\n\tget value () {\n\t\treturn this.domtokenlist.value;\n\t}\n\tset value (val) {\n\t\tif (val === null) {\n\t\t\t// when attribute is being removed\n\t\t\tthis.domtokenlist.value = \"\";\n\t\t} else {\n\t\t\tthis.domtokenlist.value = val.toLowerCase();\n \t/* jshint ignore:start */\n\t\t\tthis.#valueSet = true;\n\t\t\tthis.#element.setAttribute(this.#attribute, this.domtokenlist.value);\n\t\t\tthis.#valueSet = false;\n \t/* jshint ignore:end */\n\t\t}\n\t}\n\n\titem (index) {\n\t\treturn this.domtokenlist.item(index);\n\t}\n\n\tcontains(token) {\n\t\treturn this.domtokenlist.contains(token);\n\t}\n\n\t// Modified default behavior\n\tadd (token) {\n\t\tthis.domtokenlist.add(token);\n\t\tthis.#element.setAttribute(this.#attribute, this.domtokenlist.value);// jshint ignore:line\n\t}\n\n\t// Modified default behavior\n\tremove (token) {\n\t\tthis.domtokenlist.remove(token);\n\t\tthis.#element.setAttribute(this.#attribute, this.domtokenlist.value);// jshint ignore:line\n\t}\n\n\t// Modified default behavior\n\treplace (oldToken, newToken) {\n\t\tthis.domtokenlist.replace(oldToken, newToken);\n\t\tthis.#element.setAttribute(this.#attribute, this.domtokenlist.value);// jshint ignore:line\n\t}\n\n\t// Modified default behavior\n\tsupports (token) {\n /* jshint ignore:start */\n if (this.#domain.includes(token)) { \n return true;\n } else {\n return false;\n }\n /* jshint ignore:end */\n\t}\n\n\t// Modified default behavior\n\t//https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/toggle\n\ttoggle (token, force) {\n\t\tthis.domtokenlist.toggle(token, force);\n\t\tthis.#element.setAttribute(this.#attribute, this.domtokenlist.value);// jshint ignore:line\n\t}\n\n\tentries () {\n\t\treturn this.domtokenlist.entries();\n\t}\n\n\t//https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/forEach\n\tforEach (callback, thisArg) {\n\t\tthis.domtokenlist.forEach(callback, thisArg);\n\t}\n\n\t//https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/keys\n\tkeys () {\n\t\treturn this.domtokenlist.keys();\n\t}\n\n\t//https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/values\n\tvalues () {\n\t\treturn this.domtokenlist.values();\n\t}\n}\n"],"names":["DOMTokenList","#element","#valueSet","#attribute","#domain","constructor","initialValue","element","attribute","domain","hostingElement","document","createElement","this","domtokenlist","classList","value","valueSet","length","val","toLowerCase","setAttribute","item","index","contains","token","add","remove","replace","oldToken","newToken","supports","includes","toggle","force","entries","forEach","callback","thisArg","keys","values"],"mappings":";;qBAAqBA,aAEpBC,SACAC,UACEC,WACAC,QAEFC,YAAaC,EAAcC,EAASC,EAAWC,GAE9C,IAAMC,EAAiBC,SAASC,cAAc,OAC9CC,KAAKC,aAAeJ,EAAeK,UAInCF,KAAKX,WAAY,EACjBW,KAAKC,aAAaE,MAAQV,GAAgB,GAC1CO,KAAKZ,SAAWM,EACbM,KAAKV,WAAaK,EAClBK,KAAKT,QAAUK,EAGnBQ,eACC,OAAOJ,KAAKX,UAGbgB,aACC,OAAOL,KAAKC,aAAaI,OAG1BF,YACC,OAAOH,KAAKC,aAAaE,MAE1BA,UAAWG,GACE,OAARA,EAEHN,KAAKC,aAAaE,MAAQ,IAE1BH,KAAKC,aAAaE,MAAQG,EAAIC,cAE9BP,KAAKX,WAAY,EACjBW,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAC9DH,KAAKX,WAAY,GAKnBoB,KAAMC,GACL,OAAOV,KAAKC,aAAaQ,KAAKC,GAG/BC,SAASC,GACR,OAAOZ,KAAKC,aAAaU,SAASC,GAInCC,IAAKD,GACJZ,KAAKC,aAAaY,IAAID,GACtBZ,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAI/DW,OAAQF,GACPZ,KAAKC,aAAaa,OAAOF,GACzBZ,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAI/DY,QAASC,EAAUC,GAClBjB,KAAKC,aAAac,QAAQC,EAAUC,GACpCjB,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAI/De,SAAUN,GAEL,QAAIZ,KAAKT,QAAQ4B,SAASP,GAU/BQ,OAAQR,EAAOS,GACdrB,KAAKC,aAAamB,OAAOR,EAAOS,GAChCrB,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAG/DmB,UACC,OAAOtB,KAAKC,aAAaqB,UAI1BC,QAASC,EAAUC,GAClBzB,KAAKC,aAAasB,QAAQC,EAAUC,GAIrCC,OACC,OAAO1B,KAAKC,aAAayB,OAI1BC,SACC,OAAO3B,KAAKC,aAAa0B"} \ No newline at end of file +{"version":3,"file":"DOMTokenList.js","sources":["../src/mapml/utils/DOMTokenList.js"],"sourcesContent":["export default class DOMTokenList {\n /* jshint ignore:start */\n #element; // create element as a private property\n #valueSet; // needed to prevent infinite recursive calls to CE setAttribute\n #attribute; // the name of the attribute that will be a DOMTokenList\n #domain; // the domain of token values supported by this attribute\n /* jshint ignore:end */\n constructor(initialValue, element, attribute, domain) {\n // create donor/host div to extract DomTokenList from\n const hostingElement = document.createElement('div');\n this.domtokenlist = hostingElement.classList;\n\n // to check if value is being set, protects from infinite recursion\n // from attributeChangedCallback of mapml-viewer and web-map\n this.#valueSet = false; // jshint ignore:line\n this.domtokenlist.value = initialValue ?? '';\n this.#element = element; // jshint ignore:line\n this.#attribute = attribute; // jshint ignore:line\n this.#domain = domain; // jshint ignore:line\n }\n\n get valueSet() {\n return this.#valueSet; // jshint ignore:line\n }\n\n get length() {\n return this.domtokenlist.length;\n }\n\n get value() {\n return this.domtokenlist.value;\n }\n set value(val) {\n if (val === null) {\n // when attribute is being removed\n this.domtokenlist.value = '';\n } else {\n this.domtokenlist.value = val.toLowerCase();\n /* jshint ignore:start */\n this.#valueSet = true;\n this.#element.setAttribute(this.#attribute, this.domtokenlist.value);\n this.#valueSet = false;\n /* jshint ignore:end */\n }\n }\n\n item(index) {\n return this.domtokenlist.item(index);\n }\n\n contains(token) {\n return this.domtokenlist.contains(token);\n }\n\n // Modified default behavior\n add(token) {\n this.domtokenlist.add(token);\n this.#element.setAttribute(this.#attribute, this.domtokenlist.value); // jshint ignore:line\n }\n\n // Modified default behavior\n remove(token) {\n this.domtokenlist.remove(token);\n this.#element.setAttribute(this.#attribute, this.domtokenlist.value); // jshint ignore:line\n }\n\n // Modified default behavior\n replace(oldToken, newToken) {\n this.domtokenlist.replace(oldToken, newToken);\n this.#element.setAttribute(this.#attribute, this.domtokenlist.value); // jshint ignore:line\n }\n\n // Modified default behavior\n supports(token) {\n /* jshint ignore:start */\n if (this.#domain.includes(token)) {\n return true;\n } else {\n return false;\n }\n /* jshint ignore:end */\n }\n\n // Modified default behavior\n //https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/toggle\n toggle(token, force) {\n this.domtokenlist.toggle(token, force);\n this.#element.setAttribute(this.#attribute, this.domtokenlist.value); // jshint ignore:line\n }\n\n entries() {\n return this.domtokenlist.entries();\n }\n\n //https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/forEach\n forEach(callback, thisArg) {\n this.domtokenlist.forEach(callback, thisArg);\n }\n\n //https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/keys\n keys() {\n return this.domtokenlist.keys();\n }\n\n //https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/values\n values() {\n return this.domtokenlist.values();\n }\n}\n"],"names":["DOMTokenList","#element","#valueSet","#attribute","#domain","constructor","initialValue","element","attribute","domain","hostingElement","document","createElement","this","domtokenlist","classList","value","valueSet","length","val","toLowerCase","setAttribute","item","index","contains","token","add","remove","replace","oldToken","newToken","supports","includes","toggle","force","entries","forEach","callback","thisArg","keys","values"],"mappings":";;qBAAqBA,aAEnBC,SACAC,UACAC,WACAC,QAEAC,YAAYC,EAAcC,EAASC,EAAWC,GAE5C,IAAMC,EAAiBC,SAASC,cAAc,OAC9CC,KAAKC,aAAeJ,EAAeK,UAInCF,KAAKX,WAAY,EACjBW,KAAKC,aAAaE,MAAQV,GAAgB,GAC1CO,KAAKZ,SAAWM,EAChBM,KAAKV,WAAaK,EAClBK,KAAKT,QAAUK,EAGjBQ,eACE,OAAOJ,KAAKX,UAGdgB,aACE,OAAOL,KAAKC,aAAaI,OAG3BF,YACE,OAAOH,KAAKC,aAAaE,MAE3BA,UAAUG,GACI,OAARA,EAEFN,KAAKC,aAAaE,MAAQ,IAE1BH,KAAKC,aAAaE,MAAQG,EAAIC,cAE9BP,KAAKX,WAAY,EACjBW,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAC9DH,KAAKX,WAAY,GAKrBoB,KAAKC,GACH,OAAOV,KAAKC,aAAaQ,KAAKC,GAGhCC,SAASC,GACP,OAAOZ,KAAKC,aAAaU,SAASC,GAIpCC,IAAID,GACFZ,KAAKC,aAAaY,IAAID,GACtBZ,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAIhEW,OAAOF,GACLZ,KAAKC,aAAaa,OAAOF,GACzBZ,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAIhEY,QAAQC,EAAUC,GAChBjB,KAAKC,aAAac,QAAQC,EAAUC,GACpCjB,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAIhEe,SAASN,GAEP,QAAIZ,KAAKT,QAAQ4B,SAASP,GAU5BQ,OAAOR,EAAOS,GACZrB,KAAKC,aAAamB,OAAOR,EAAOS,GAChCrB,KAAKZ,SAASoB,aAAaR,KAAKV,WAAYU,KAAKC,aAAaE,OAGhEmB,UACE,OAAOtB,KAAKC,aAAaqB,UAI3BC,QAAQC,EAAUC,GAChBzB,KAAKC,aAAasB,QAAQC,EAAUC,GAItCC,OACE,OAAO1B,KAAKC,aAAayB,OAI3BC,SACE,OAAO3B,KAAKC,aAAa0B"} \ No newline at end of file diff --git a/src/extension/mapml/src/main/resources/viewer/widget/README.md b/src/extension/mapml/src/main/resources/viewer/widget/README.md index 51a0cef5109..ab44de8428c 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/README.md +++ b/src/extension/mapml/src/main/resources/viewer/widget/README.md @@ -40,6 +40,48 @@ * Title to copyright in this work will at all times remain with copyright holders. */ +Copyright 2015-2023 Canada Centre for Mapping and Earth Observation, +Strategic Policy and Innovation Sector, Natural Resources Canada. + +License + +By obtaining and/or copying this work, you (the licensee) agree that you have +read, understood, and will comply with the following terms and conditions. + +Permission to copy, modify, and distribute this work, with or without +modification, for any purpose and without fee or royalty is hereby granted, +provided that you include the following on ALL copies of the work or portions +thereof, including modifications: + +The full text of this NOTICE in a location viewable to users of the +redistributed or derivative work. + +Any pre-existing intellectual property disclaimers, notices, or terms and +conditions. If none exist, the W3C Software and Document Short Notice should +be included. + +Notice of any changes or modifications, through a copyright statement on the +new code or document such as "This software or document includes material +copied from or derived from [title and URI of the W3C document]. +Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." + +Disclaimers + +THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS +OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF +MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE +SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, +TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. + +The name and trademarks of copyright holders may NOT be used in advertising or +publicity pertaining to the work without specific, written prior permission. +Title to copyright in this work will at all times remain with copyright holders. + +Dependency license + +BSD 2-Clause License Copyright (c) 2010-2023, Volodymyr Agafonkin Copyright (c) 2010-2011, CloudMade @@ -72,6 +114,8 @@ Permission to use, copy, modify, and/or distribute this software for any purpose THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The MIT License (MIT) + Copyright (c) 2014 Dominik Moritz Permission is hereby granted, free of charge, to any person obtaining a copy @@ -145,6 +189,7 @@ Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE._ +The MIT License (MIT) -- Copyright (c) 2017 adam.ratcliffe@gmail.com @@ -155,6 +200,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The MIT License (MIT) Copyright (c) 2015 Xisco Guaita diff --git a/src/extension/mapml/src/main/resources/viewer/widget/layer.js b/src/extension/mapml/src/main/resources/viewer/widget/layer.js index 0d4d4e8b1d6..a0bf6628119 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/layer.js +++ b/src/extension/mapml/src/main/resources/viewer/widget/layer.js @@ -1,17 +1,4 @@ -/*! @maps4html/web-map-custom-element 28-04-2023 */ -/* (c) 2023 Open Source Geospatial Foundation - all rights reserved - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - * Copyright (c) 2023 Canada Centrre for Mapping and Earth Observation, Natural - * Resources Canada - * Copyright © 2023 World Wide Web Consortium, (Massachusetts Institute of Technology, - * European Research Consortium for Informatics and Mathematics, Keio - * University, Beihang). All Rights Reserved. This work is distributed under the - * W3C® Software License [1] in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. - * [1] http://www.w3.org/Consortium/Legal/copyright-software - * - */ -import"./leaflet.js";import"./mapml.js";class MapLayer extends HTMLElement{static get observedAttributes(){return["src","label","checked","hidden","opacity"]}get src(){return this.hasAttribute("src")?this.getAttribute("src"):""}set src(t){t&&this.setAttribute("src",t)}get label(){return this.hasAttribute("label")?this.getAttribute("label"):""}set label(t){t&&this.setAttribute("label",t)}get checked(){return this.hasAttribute("checked")}set checked(t){t?this.setAttribute("checked",""):this.removeAttribute("checked")}get hidden(){return this.hasAttribute("hidden")}set hidden(t){t?this.setAttribute("hidden",""):this.removeAttribute("hidden")}get opacity(){return this._layer._container.style.opacity||this._layer.options.opacity}set opacity(t){1<+t||+t<0||this._layer.changeOpacity(t)}constructor(){super()}disconnectedCallback(){this.hasAttribute("data-moving")||this._onRemove()}_onRemove(){this._removeEvents(),this._layer._map&&this._layer._map.removeLayer(this._layer),this._layerControl&&!this.hidden&&this._layerControl.removeLayer(this._layer),this.shadowRoot&&(this.shadowRoot.innerHTML="")}connectedCallback(){this.hasAttribute("data-moving")||this._onAdd()}_onAdd(){this.getAttribute("src")&&!this.shadowRoot&&this.attachShadow({mode:"open"}),this.parentNode.addEventListener("createmap",()=>{this._ready(),this.parentNode._map&&this._attachedToMap(),this._layerControl&&!this.hidden&&this._layerControl.addOrUpdateOverlay(this._layer,this.label)},{once:!0}),this.parentNode._map&&this.parentNode.dispatchEvent(new CustomEvent("createmap"))}adoptedCallback(){}attributeChangedCallback(t,e,a){switch(t){case"label":e!==a&&this.dispatchEvent(new CustomEvent("labelchanged",{detail:{target:this}}));break;case"checked":this._layer&&("string"==typeof a?this.parentElement._map.addLayer(this._layer):this.parentElement._map.removeLayer(this._layer),this.dispatchEvent(new Event("change",{bubbles:!0})));break;case"hidden":this.parentElement&&this.parentElement._map&&this.parentElement.controls&&("string"==typeof a?this._layer&&this.parentElement._layerControl.removeLayer(this._layer):(this._layerControl=this.parentElement._layerControl,this._layerControl.addOrUpdateOverlay(this._layer,this.label),this._validateDisabled()));break;case"opacity":e!==a&&this._layer&&(this.opacity=a);break;case"src":e!==a&&this._layer&&this._reload()}}_reload(){var t=this.opacity;this._onRemove(),this.isConnected&&this._onAdd(),this.opacity=t}_onLayerExtentLoad(t){this._layer._legendUrl&&(this.legendLinks=[{type:"application/octet-stream",href:this._layer._legendUrl,rel:"legend",lang:null,hreflang:null,sizes:null}]),this._layer._title&&(this.label=this._layer._title),this._layer._map&&this._layer.fire("attached",this._layer),this._layerControl&&this._layerControl.addOrUpdateOverlay(this._layer,this.label),this._layer.error?this.dispatchEvent(new CustomEvent("error",{detail:{target:this}})):this.dispatchEvent(new CustomEvent("loadedmetadata",{detail:{target:this}}))}_validateDisabled(){setTimeout(()=>{let s=this._layer,t=s?._map;if(t){let a=0,i=0,e=["_staticTileLayer","_imageLayer","_mapmlvectors","_templatedLayer"];if(s.validProjection)for(let t=0;t{t.hasAttribute("href")?t.setAttribute("href",decodeURI(new URL(t.attributes.href.value,this.baseURI||document.baseURI).href)):t.hasAttribute("tref")&&t.setAttribute("tref",decodeURI(new URL(t.attributes.tref.value,this.baseURI||document.baseURI).href))})}var t=e.outerHTML;return e.remove(),t}_onLayerChange(){this._layer._map&&(this.checked=this._layer._map.hasLayer(this._layer))}_ready(){var t=this.baseURI||document.baseURI,e=this.hasAttribute("opacity")?this.getAttribute("opacity"):"1.0";this._layer=M.mapMLLayer(this.src?new URL(this.src,t).href:null,this,{mapprojection:this.parentElement._map.options.projection,opacity:e}),this._layer.on("extentload",this._onLayerExtentLoad,this),this._setUpEvents()}_attachedToMap(){for(var t=0,e=1,a=this.parentNode.children;t"===t.slice(-14)&&this.insertAdjacentHTML("beforeend",t);break;case"object":"MAP-FEATURE"===t.nodeName.toUpperCase()&&this.appendChild(t)}}}export{MapLayer}; +/*! @maps4html/web-map-custom-element 27-09-2023 */ + +import"./leaflet.js";import"./mapml.js";class MapLayer extends HTMLElement{static get observedAttributes(){return["src","label","checked","hidden","opacity"]}get src(){return this.hasAttribute("src")?this.getAttribute("src"):""}set src(e){e&&this.setAttribute("src",e)}get label(){return this._layer?this._layer.getName():this.hasAttribute("label")?this.getAttribute("label"):""}set label(e){e&&this.setAttribute("label",e)}get checked(){return this.hasAttribute("checked")}set checked(e){e?this.setAttribute("checked",""):this.removeAttribute("checked")}get hidden(){return this.hasAttribute("hidden")}set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}get opacity(){return this._opacity??this.getAttribute("opacity")}set opacity(e){1<+e||+e<0||this.setAttribute("opacity",e)}constructor(){super()}disconnectedCallback(){this.hasAttribute("data-moving")||this._onRemove()}_onRemove(){this._layer&&this._layer.off(),this._layer&&this._layer._map&&this._layer._map.removeLayer(this._layer),this._layerControl&&!this.hidden&&this._layerControl.removeLayer(this._layer),delete this._layer,this.shadowRoot&&(this.shadowRoot.innerHTML="")}connectedCallback(){if(!this.hasAttribute("data-moving")){const e=this._onAdd.bind(this);this.parentElement.whenReady().then(()=>{e()}).catch(()=>{throw new Error("Map never became ready")})}}_onAdd(){this.getAttribute("src")&&!this.shadowRoot&&this.attachShadow({mode:"open"}),new Promise((a,t)=>{this.addEventListener("changestyle",function(e){e.stopPropagation(),this.src=e.detail.src},{once:!0}),this.addEventListener("changeprojection",function(e){e.stopPropagation(),t(e)},{once:!0});let r=this.baseURI||document.baseURI;const e=new Headers;e.append("Accept","text/mapml"),this.src?fetch(this.src,{headers:e}).then(e=>{if(!e.ok)throw new Error("HTTP error! Status: "+e.status);return e.text()}).then(e=>{let t=(new DOMParser).parseFromString(e,"text/xml");if(t.querySelector("parsererror")||!t.querySelector("mapml-"))throw new Error("Parser error");this._layer&&this._onRemove(),this._layer=M.mapMLLayer(new URL(this.src,r).href,this,t,{mapprojection:this.parentElement.projection,opacity:this.opacity}),this._attachedToMap(),this._validateDisabled(),a()}).catch(e=>{console.log("Error fetching layer content"+e)}):(this._layer&&this._onRemove(),this._layer=M.mapMLLayer(null,this,null,{mapprojection:this.parentElement.projection,opacity:this.opacity}),this._attachedToMap(),this._validateDisabled(),a())}).catch(e=>{"changeprojection"===e.type?this.src=e.detail.href:(console.log(e),this.dispatchEvent(new CustomEvent("error",{detail:{target:this}})))})}_attachedToMap(){for(var e=0,t=1,a=this.parentNode.children;e{this._layer.setName(a)});break;case"checked":this._layer&&("string"==typeof a?this.parentElement._map.addLayer(this._layer):this.parentElement._map.removeLayer(this._layer),this.dispatchEvent(new Event("change",{bubbles:!0})));break;case"hidden":this.parentElement&&this.parentElement._map&&this.parentElement.controls&&("string"==typeof a?this._layer&&this.parentElement._layerControl.removeLayer(this._layer):(this._layerControl=this.parentElement._layerControl,this._layerControl.addOrUpdateOverlay(this._layer,this.label),this._validateDisabled()));break;case"opacity":t!==a&&this._layer&&(this._opacity=a,this._layer.changeOpacity(a));break;case"src":t!==a&&this._layer&&(this._onRemove(),this.isConnected&&this._onAdd())}}_validateDisabled(){setTimeout(()=>{let i=this._layer,e=i?._map;if(e){let a=0,r=0,t=["_staticTileLayer","_imageLayer","_mapmlvectors","_templatedLayer"];if(i.validProjection)for(let e=0;e{e.hasAttribute("href")?e.setAttribute("href",decodeURI(new URL(e.attributes.href.value,this.baseURI||document.baseURI).href)):e.hasAttribute("tref")&&e.setAttribute("tref",decodeURI(new URL(e.attributes.tref.value,this.baseURI||document.baseURI).href))})}var e=t.outerHTML;return t.remove(),e}_onLayerChange(){this._layer._map&&(this.checked=this._layer._map.hasLayer(this._layer))}zoomTo(){if(this.extent){let e=this.parentElement._map,t=this.extent.topLeft.pcrs,a=this.extent.bottomRight.pcrs,r=L.bounds(L.point(t.horizontal,t.vertical),L.point(a.horizontal,a.vertical)),i=e.options.crs.unproject(r.getCenter(!0));var s=this.extent.zoom.maxZoom,h=this.extent.zoom.minZoom;e.setView(i,M.getMaxZoom(r,e,h,s),{animate:!1})}}mapml2geojson(e={}){return M.mapml2geojson(this,e)}pasteFeature(e){switch(typeof e){case"string":e.trim(),""===e.slice(-14)&&this.insertAdjacentHTML("beforeend",e);break;case"object":"MAP-FEATURE"===e.nodeName.toUpperCase()&&this.appendChild(e)}}whenReady(){return new Promise((t,e)=>{let a,r;this._layer?t():(a=setInterval(function(e){e._layer&&(clearInterval(a),clearTimeout(r),t())},200,this),r=setTimeout(function(){clearInterval(a),clearTimeout(r),e("Timeout reached waiting for layer to be ready")},5e3))})}}export{MapLayer}; //# sourceMappingURL=layer.js.map \ No newline at end of file diff --git a/src/extension/mapml/src/main/resources/viewer/widget/layer.js.map b/src/extension/mapml/src/main/resources/viewer/widget/layer.js.map index e63015911f8..24dd11d8eb5 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/layer.js.map +++ b/src/extension/mapml/src/main/resources/viewer/widget/layer.js.map @@ -1 +1 @@ -{"version":3,"file":"layer.js","sources":["../src/layer.js"],"sourcesContent":["import './leaflet.js'; // a lightly modified version of Leaflet for use as browser module\nimport './mapml.js'; // modified URI to make the function a property of window scope (possibly a bad thing to do).\n\nexport class MapLayer extends HTMLElement {\n static get observedAttributes() {\n return ['src', 'label', 'checked', 'hidden', 'opacity'];\n }\n get src() {\n return this.hasAttribute('src')?this.getAttribute('src'):'';\n }\n\n set src(val) {\n if (val) {\n this.setAttribute('src', val);\n }\n }\n get label() {\n return this.hasAttribute('label')?this.getAttribute('label'):'';\n }\n set label(val) {\n if (val) {\n this.setAttribute('label',val);\n }\n }\n get checked() {\n return this.hasAttribute('checked');\n }\n \n set checked(val) {\n if (val) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n }\n \n get hidden() {\n return this.hasAttribute('hidden');\n }\n\n set hidden(val) {\n if (val) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n }\n\n get opacity(){\n return this._layer._container.style.opacity || this._layer.options.opacity;\n }\n\n set opacity(val) {\n if(+val > 1 || +val < 0) return;\n this._layer.changeOpacity(val);\n }\n\n constructor() {\n // Always call super first in constructor\n super(); \n }\n disconnectedCallback() {\n // console.log('Custom map element removed from page.');\n // if the map-layer node is removed from the dom, the layer should be\n // removed from the map and the layer control \n\n // this is moved up here so that the layer control doesn't respond\n // to the layer being removed with the _onLayerChange execution\n // that is set up in _attached:\n if(this.hasAttribute(\"data-moving\")) return;\n this._onRemove();\n }\n\n _onRemove() {\n this._removeEvents();\n if (this._layer._map) {\n this._layer._map.removeLayer(this._layer);\n }\n\n if (this._layerControl && !this.hidden) {\n this._layerControl.removeLayer(this._layer);\n }\n\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = '';\n }\n }\n\n connectedCallback() {\n if(this.hasAttribute(\"data-moving\")) return;\n this._onAdd();\n }\n\n _onAdd() {\n if(this.getAttribute('src') && !this.shadowRoot) {\n this.attachShadow({mode: 'open'});\n }\n //creates listener that waits for createmap event, this allows for delayed builds of maps\n //this allows a safeguard for the case where loading a custom TCRS takes longer than loading mapml-viewer.js/web-map.js\n this.parentNode.addEventListener('createmap', ()=>{\n this._ready();\n // if the map has been attached, set this layer up wrt Leaflet map\n if (this.parentNode._map) {\n this._attachedToMap();\n }\n if (this._layerControl && !this.hidden) {\n this._layerControl.addOrUpdateOverlay(this._layer, this.label);\n }\n }, {once:true}); //listener stops listening after event occurs once\n //if map is already created then dispatch createmap event, allowing layer to be built\n if(this.parentNode._map)this.parentNode.dispatchEvent(new CustomEvent('createmap'));\n }\n\n adoptedCallback() {\n // console.log('Custom map element moved to new page.');\n }\n attributeChangedCallback(name, oldValue, newValue) {\n switch(name) {\n case 'label': \n if (oldValue !== newValue) {\n this.dispatchEvent(new CustomEvent('labelchanged', {detail: \n {target: this}}));\n }\n break;\n case 'checked': \n if (this._layer) {\n if (typeof newValue === \"string\") {\n this.parentElement._map.addLayer(this._layer);\n } else {\n this.parentElement._map.removeLayer(this._layer);\n }\n this.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n break;\n case 'hidden':\n var map = this.parentElement && this.parentElement._map;\n if (map && this.parentElement.controls) {\n if (typeof newValue === \"string\") {\n if (this._layer) {\n this.parentElement._layerControl.removeLayer(this._layer);\n }\n } else {\n this._layerControl = this.parentElement._layerControl;\n this._layerControl.addOrUpdateOverlay(this._layer, this.label);\n this._validateDisabled();\n }\n }\n break;\n case 'opacity':\n if (oldValue !== newValue && this._layer) {\n this.opacity = newValue;\n }\n break;\n case 'src':\n if (oldValue !== newValue && this._layer) {\n this._reload();\n // the original inline content will not be removed\n // but has NO EFFECT and works as a fallback\n }\n }\n }\n // re-load the layer element when the src attribute is changed\n _reload() {\n let oldOpacity = this.opacity;\n // go through the same sequence as if the layer had been removed from\n // the DOM and re-attached with a new URL source.\n this._onRemove();\n if (this.isConnected) {\n this._onAdd();\n }\n this.opacity = oldOpacity;\n }\n _onLayerExtentLoad(e) {\n // the mapml document associated to this layer can in theory contain many\n // link[@rel=legend] elements with different @type or other attributes;\n // currently only support a single link, don't care about type, lang etc.\n // TODO: add support for full LayerLegend object, and > one link.\n if (this._layer._legendUrl) {\n this.legendLinks = \n [{ type: 'application/octet-stream',\n href: this._layer._legendUrl,\n rel: 'legend',\n lang: null,\n hreflang: null,\n sizes: null }];\n }\n if (this._layer._title) {\n this.label = this._layer._title;\n }\n // make sure local content layer has the chance to set its extent properly\n // which is important for the layer control and the disabled property\n if (this._layer._map) {\n this._layer.fire('attached', this._layer);\n }\n // TODO ensure the controls in this._layerControl contain 'live' controls\n // which control the layer, not potentially the previous style / src\n if (this._layerControl) {\n this._layerControl.addOrUpdateOverlay(this._layer, this.label);\n }\n if (!this._layer.error) {\n // re-use 'loadedmetadata' event from HTMLMediaElement inteface, applied\n // to MapML extent as metadata\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadedmetadata_event\n this.dispatchEvent(new CustomEvent('loadedmetadata', {detail: \n {target: this}}));\n } else {\n this.dispatchEvent(new CustomEvent('error', {detail: \n {target: this}}));\n }\n }\n _validateDisabled() {\n setTimeout(() => {\n let layer = this._layer, map = layer?._map;\n if (map) {\n let count = 0, total=0, layerTypes = [\"_staticTileLayer\",\"_imageLayer\",\"_mapmlvectors\",\"_templatedLayer\"];\n if(layer.validProjection){\n for(let j = 0 ;j {\n \n if (mapLink.hasAttribute('href')) {\n mapLink.setAttribute('href', decodeURI((new URL(mapLink.attributes.href.value, this.baseURI ? this.baseURI : document.baseURI)).href));\n }\n else if (mapLink.hasAttribute('tref')) {\n mapLink.setAttribute('tref', decodeURI((new URL(mapLink.attributes.tref.value, this.baseURI ? this.baseURI : document.baseURI)).href));\n }\n });\n }\n\n let outerLayer = tempElement.outerHTML;\n\n tempElement.remove();\n\n return outerLayer;\n }\n\n _onLayerChange() {\n if (this._layer._map) {\n // can't disable observers, have to set a flag telling it where\n // the 'event' comes from: either the api or a user click/tap\n // may not be necessary -> this._apiToggleChecked = false;\n this.checked = this._layer._map.hasLayer(this._layer);\n }\n }\n _ready() {\n // the layer might not be attached to a map\n // so we need a way for non-src based layers to establish what their\n // zoom range, extent and projection are. meta elements in content to\n // allow the author to provide this explicitly are one way, they will\n // be parsed from the second parameter here\n // IE 11 did not have a value for this.baseURI for some reason\n var base = this.baseURI ? this.baseURI : document.baseURI;\n let opacity_value = this.hasAttribute(\"opacity\")?this.getAttribute(\"opacity\"):\"1.0\";\n this._layer = M.mapMLLayer(this.src ? (new URL(this.src, base)).href: null, this, {mapprojection:this.parentElement._map.options.projection,opacity:opacity_value});\n this._layer.on('extentload', this._onLayerExtentLoad, this);\n this._setUpEvents();\n }\n _attachedToMap() {\n // set i to the position of this layer element in the set of layers\n var i = 0, position = 1;\n for (var nodes = this.parentNode.children;i < nodes.length;i++) {\n if (this.parentNode.children[i].nodeName === \"LAYER-\") {\n if (this.parentNode.children[i] === this) {\n position = i + 1;\n } else if (this.parentNode.children[i]._layer) {\n this.parentNode.children[i]._layer.setZIndex(i+1);\n }\n }\n }\n var proj = this.parentNode.projection ? this.parentNode.projection : \"OSMTILE\";\n L.setOptions(this._layer, {zIndex: position, mapprojection: proj, opacity: window.getComputedStyle(this).opacity});\n // make sure the Leaflet layer has a reference to the map\n this._layer._map = this.parentNode._map;\n // notify the layer that it is attached to a map (layer._map)\n this._layer.fire('attached');\n\n if (this.checked) {\n this._layer.addTo(this._layer._map);\n }\n \n // add the handler which toggles the 'checked' property based on the\n // user checking/unchecking the layer from the layer control\n // this must be done *after* the layer is actually added to the map\n this._layer.on('add remove', this._onLayerChange, this);\n this._layer.on('add remove extentload', this._validateDisabled, this);\n\n // if controls option is enabled, insert the layer into the overlays array\n if (this.parentNode._layerControl && !this.hidden) {\n this._layerControl = this.parentNode._layerControl;\n this._layerControl.addOrUpdateOverlay(this._layer, this.label);\n }\n // toggle the this.disabled attribute depending on whether the layer\n // is: same prj as map, within view/zoom of map\n this._layer._map.on('moveend', this._validateDisabled, this);\n this._layer._map.on('checkdisabled', this._validateDisabled, this);\n // this is necessary to get the layer control to compare the layer\n // extents with the map extent & zoom, but it needs to be rethought TODO\n // for one thing, layers which are checked by the author before \n // adding to the map are displayed despite that they are not visible\n // See issue #26\n // this._layer._map.fire('moveend');\n }\n _removeEvents() {\n if (this._layer) {\n this._layer.off();\n }\n }\n _setUpEvents() {\n this._layer.on('loadstart', \n function () {\n this.dispatchEvent(new CustomEvent('loadstart', {detail: \n {target: this}}));\n }, this); \n this._layer.on('changestyle',\n function(e) {\n this.src = e.src;\n this.dispatchEvent(new CustomEvent('changestyle', {detail: \n {target: this}}));\n },this);\n this._layer.on('changeprojection',\n function(e) {\n this.src = e.href;\n this.dispatchEvent(new CustomEvent('changeprojection', {detail: \n {target: this}}));\n },this);\n }\n zoomTo() {\n if(!this.extent) return;\n let map = this._layer._map,\n tL = this.extent.topLeft.pcrs,\n bR = this.extent.bottomRight.pcrs,\n layerBounds = L.bounds(L.point(tL.horizontal, tL.vertical), L.point(bR.horizontal, bR.vertical)),\n center = map.options.crs.unproject(layerBounds.getCenter(true));\n\n let maxZoom = this.extent.zoom.maxZoom, \n minZoom = this.extent.zoom.minZoom;\n map.setView(center, M.getMaxZoom(layerBounds, map, minZoom, maxZoom), {animate: false});\n }\n mapml2geojson(options = {}){\n return M.mapml2geojson(this, options);\n }\n pasteFeature(feature) {\n switch(typeof feature) {\n case \"string\":\n feature.trim();\n if (feature.slice(0,12) === \"\") {\n this.insertAdjacentHTML(\"beforeend\", feature);\n }\n break;\n case \"object\": \n if (feature.nodeName.toUpperCase() === 'MAP-FEATURE') {\n this.appendChild(feature);\n }\n }\n }\n}\n"],"names":["MapLayer","HTMLElement","observedAttributes","src","this","hasAttribute","getAttribute","val","setAttribute","label","checked","removeAttribute","hidden","opacity","_layer","_container","style","options","changeOpacity","constructor","super","disconnectedCallback","_onRemove","_removeEvents","_map","removeLayer","_layerControl","shadowRoot","innerHTML","connectedCallback","_onAdd","attachShadow","mode","parentNode","addEventListener","_ready","_attachedToMap","addOrUpdateOverlay","once","dispatchEvent","CustomEvent","adoptedCallback","attributeChangedCallback","name","oldValue","newValue","detail","target","parentElement","addLayer","Event","bubbles","controls","_validateDisabled","_reload","let","oldOpacity","isConnected","_onLayerExtentLoad","e","_legendUrl","legendLinks","type","href","rel","lang","hreflang","sizes","_title","fire","error","setTimeout","layer","map","count","total","layerTypes","validProjection","j","length","i","_extent","_mapExtents","templatedLayer","_templates","disabled","getOuterHTML","tempElement","cloneNode","newSrc","getHref","querySelector","mapLinks","querySelectorAll","forEach","mapLink","decodeURI","URL","attributes","value","baseURI","document","tref","outerLayer","outerHTML","remove","_onLayerChange","hasLayer","base","opacity_value","M","mapMLLayer","mapprojection","projection","on","_setUpEvents","position","nodes","children","nodeName","setZIndex","proj","L","setOptions","zIndex","window","getComputedStyle","addTo","off","zoomTo","extent","tL","topLeft","pcrs","bR","bottomRight","layerBounds","bounds","point","horizontal","vertical","center","crs","unproject","getCenter","maxZoom","zoom","minZoom","setView","getMaxZoom","animate","mapml2geojson","pasteFeature","feature","trim","slice","insertAdjacentHTML","toUpperCase","appendChild"],"mappings":";;8CAGaA,iBAAiBC,YAC5BC,gCACE,MAAO,CAAC,MAAO,QAAS,UAAW,SAAU,WAE/CC,UACE,OAAOC,KAAKC,aAAa,OAAOD,KAAKE,aAAa,OAAO,GAG3DH,QAAQI,GACFA,GACFH,KAAKI,aAAa,MAAOD,GAG7BE,YACE,OAAOL,KAAKC,aAAa,SAASD,KAAKE,aAAa,SAAS,GAE/DG,UAAUF,GACJA,GACFH,KAAKI,aAAa,QAAQD,GAG9BG,cACE,OAAON,KAAKC,aAAa,WAG3BK,YAAYH,GACNA,EACFH,KAAKI,aAAa,UAAW,IAE7BJ,KAAKO,gBAAgB,WAIzBC,aACE,OAAOR,KAAKC,aAAa,UAG3BO,WAAWL,GACLA,EACFH,KAAKI,aAAa,SAAU,IAE5BJ,KAAKO,gBAAgB,UAIzBE,cACE,OAAOT,KAAKU,OAAOC,WAAWC,MAAMH,SAAWT,KAAKU,OAAOG,QAAQJ,QAGrEA,YAAYN,GACA,GAANA,IAAYA,EAAM,GACtBH,KAAKU,OAAOI,cAAcX,GAG5BY,cAEEC,QAEFC,uBAQKjB,KAAKC,aAAa,gBACrBD,KAAKkB,YAGPA,YACElB,KAAKmB,gBACDnB,KAAKU,OAAOU,MACdpB,KAAKU,OAAOU,KAAKC,YAAYrB,KAAKU,QAGhCV,KAAKsB,gBAAkBtB,KAAKQ,QAC9BR,KAAKsB,cAAcD,YAAYrB,KAAKU,QAGlCV,KAAKuB,aACPvB,KAAKuB,WAAWC,UAAY,IAIhCC,oBACKzB,KAAKC,aAAa,gBACrBD,KAAK0B,SAGPA,SACK1B,KAAKE,aAAa,SAAWF,KAAKuB,YACnCvB,KAAK2B,aAAa,CAACC,KAAM,SAI3B5B,KAAK6B,WAAWC,iBAAiB,YAAa,KAC5C9B,KAAK+B,SAED/B,KAAK6B,WAAWT,MAChBpB,KAAKgC,iBAELhC,KAAKsB,gBAAkBtB,KAAKQ,QAC9BR,KAAKsB,cAAcW,mBAAmBjC,KAAKU,OAAQV,KAAKK,QAEzD,CAAC6B,MAAK,IAENlC,KAAK6B,WAAWT,MAAKpB,KAAK6B,WAAWM,cAAc,IAAIC,YAAY,cAGxEC,mBAGAC,yBAAyBC,EAAMC,EAAUC,GACvC,OAAOF,GACL,IAAK,QACCC,IAAaC,GACfzC,KAAKmC,cAAc,IAAIC,YAAY,eAAgB,CAACM,OAClD,CAACC,OAAQ3C,SAEf,MACA,IAAK,UACCA,KAAKU,SACiB,iBAAb+B,EACTzC,KAAK4C,cAAcxB,KAAKyB,SAAS7C,KAAKU,QAEtCV,KAAK4C,cAAcxB,KAAKC,YAAYrB,KAAKU,QAE3CV,KAAKmC,cAAc,IAAIW,MAAM,SAAU,CAAEC,SAAS,MAEtD,MACA,IAAK,SACK/C,KAAK4C,eAAiB5C,KAAK4C,cAAcxB,MACxCpB,KAAK4C,cAAcI,WACF,iBAAbP,EACHzC,KAAKU,QACPV,KAAK4C,cAActB,cAAcD,YAAYrB,KAAKU,SAGpDV,KAAKsB,cAAgBtB,KAAK4C,cAActB,cACxCtB,KAAKsB,cAAcW,mBAAmBjC,KAAKU,OAAQV,KAAKK,OACxDL,KAAKiD,sBAGb,MACA,IAAK,UACCT,IAAaC,GAAYzC,KAAKU,SAChCV,KAAKS,QAAUgC,GAEnB,MACA,IAAK,MACCD,IAAaC,GAAYzC,KAAKU,QAChCV,KAAKkD,WAObA,UACEC,IAAIC,EAAapD,KAAKS,QAGtBT,KAAKkB,YACDlB,KAAKqD,aACPrD,KAAK0B,SAEP1B,KAAKS,QAAU2C,EAEjBE,mBAAmBC,GAKbvD,KAAKU,OAAO8C,aACdxD,KAAKyD,YACH,CAAC,CAAEC,KAAM,2BACNC,KAAM3D,KAAKU,OAAO8C,WAClBI,IAAK,SACLC,KAAM,KACNC,SAAU,KACVC,MAAO,QAEV/D,KAAKU,OAAOsD,SACdhE,KAAKK,MAAQL,KAAKU,OAAOsD,QAIvBhE,KAAKU,OAAOU,MACdpB,KAAKU,OAAOuD,KAAK,WAAYjE,KAAKU,QAIhCV,KAAKsB,eACPtB,KAAKsB,cAAcW,mBAAmBjC,KAAKU,OAAQV,KAAKK,OAErDL,KAAKU,OAAOwD,MAOflE,KAAKmC,cAAc,IAAIC,YAAY,QAAS,CAACM,OACnC,CAACC,OAAQ3C,SAJnBA,KAAKmC,cAAc,IAAIC,YAAY,iBAAkB,CAACM,OAC5C,CAACC,OAAQ3C,SAMvBiD,oBACEkB,WAAW,KACThB,IAAIiB,EAAQpE,KAAKU,OAAQ2D,EAAMD,GAAOhD,KACtC,GAAIiD,EAAK,CACPlB,IAAImB,EAAQ,EAAGC,EAAM,EAAGC,EAAa,CAAC,mBAAmB,cAAc,gBAAgB,mBACvF,GAAGJ,EAAMK,gBACP,IAAItB,IAAIuB,EAAI,EAAGA,EAAEF,EAAWG,OAAOD,IAAI,CACrCvB,IAAIO,EAAOc,EAAWE,GACtB,GAAG1E,KAAKM,SAAW8D,EAAMV,GACvB,GAAY,oBAATA,EACD,IAAIP,IAAIyB,EAAG,EAAEA,EAAER,EAAMS,QAAQC,YAAYH,OAAOC,IAC9C,IAAIzB,IAAIuB,EAAI,EAAGA,EAAIN,EAAMS,QAAQC,YAAYF,GAAGG,eAAeC,WAAWL,OAAQD,IACZ,UAAjEN,EAAMS,QAAQC,YAAYF,GAAGG,eAAeC,WAAWN,GAAGd,MAC7DW,IACAH,EAAMS,QAAQC,YAAYF,GAAGrE,gBAAgB,YAC7C6D,EAAMS,QAAQC,YAAYF,GAAGK,UAAW,EACnCb,EAAMS,QAAQC,YAAYF,GAAGG,eAAeC,WAAWN,GAAGN,MAAe,YAC5EE,IACAF,EAAMS,QAAQC,YAAYF,GAAGxE,aAAa,WAAY,IACtDgE,EAAMS,QAAQC,YAAYF,GAAGK,UAAW,SAK9CV,IACOH,EAAMV,GAAe,WAAEY,SAKpCA,EAAQ,EACRC,EAAQ,EAGPD,IAAUC,GAAmB,IAAVD,GACpBtE,KAAKI,aAAa,WAAY,IAC9BJ,KAAKiF,UAAW,IAGhBjF,KAAKO,gBAAgB,YACrBP,KAAKiF,UAAW,GAElBZ,EAAIJ,KAAK,cAEV,GAELiB,eAEE/B,IAAIgC,EAAcnF,KAAKoF,WAAU,GAMjC,GAJIpF,KAAKC,aAAa,SAChBoF,EAASrF,KAAKU,OAAO4E,UACzBH,EAAY/E,aAAa,MAAMiF,IAE7BrF,KAAKuF,cAAc,YAAa,CAClCpC,IAAIqC,EAAWL,EAAYM,iBAAiB,YAE5CD,EAASE,QAAQ,IAEXC,EAAQ1F,aAAa,QACvB0F,EAAQvF,aAAa,OAAQwF,UAAU,IAAKC,IAAIF,EAAQG,WAAWnC,KAAKoC,MAAO/F,KAAKgG,SAAyBC,SAASD,SAAUrC,OAEzHgC,EAAQ1F,aAAa,SAC5B0F,EAAQvF,aAAa,OAAQwF,UAAU,IAAKC,IAAIF,EAAQG,WAAWI,KAAKH,MAAO/F,KAAKgG,SAAyBC,SAASD,SAAUrC,SAKtIR,IAAIgD,EAAahB,EAAYiB,UAI7B,OAFAjB,EAAYkB,SAELF,EAGTG,iBACMtG,KAAKU,OAAOU,OAIfpB,KAAKM,QAAUN,KAAKU,OAAOU,KAAKmF,SAASvG,KAAKU,SAGjDqB,SAOE,IAAIyE,EAAOxG,KAAKgG,SAAyBC,SAASD,QAC9CS,EAAgBzG,KAAKC,aAAa,WAAWD,KAAKE,aAAa,WAAW,MAC9EF,KAAKU,OAASgG,EAAEC,WAAW3G,KAAKD,IAAM,IAAK8F,IAAI7F,KAAKD,IAAKyG,GAAO7C,KAAM,KAAM3D,KAAM,CAAC4G,cAAc5G,KAAK4C,cAAcxB,KAAKP,QAAQgG,WAAWpG,QAAQgG,IACpJzG,KAAKU,OAAOoG,GAAG,aAAc9G,KAAKsD,mBAAoBtD,MACtDA,KAAK+G,eAEP/E,iBAGE,IADA,IAAI4C,EAAI,EAAGoC,EAAW,EACbC,EAAQjH,KAAK6B,WAAWqF,SAAStC,EAAIqC,EAAMtC,OAAOC,IACZ,WAAzC5E,KAAK6B,WAAWqF,SAAStC,GAAGuC,WAC1BnH,KAAK6B,WAAWqF,SAAStC,KAAO5E,KAClCgH,EAAWpC,EAAI,EACN5E,KAAK6B,WAAWqF,SAAStC,GAAGlE,QACrCV,KAAK6B,WAAWqF,SAAStC,GAAGlE,OAAO0G,UAAUxC,EAAE,IAIrD,IAAIyC,EAAOrH,KAAK6B,WAAWgF,YAA0C,UACrES,EAAEC,WAAWvH,KAAKU,OAAQ,CAAC8G,OAAQR,EAAUJ,cAAeS,EAAM5G,QAASgH,OAAOC,iBAAiB1H,MAAMS,UAEzGT,KAAKU,OAAOU,KAAOpB,KAAK6B,WAAWT,KAEnCpB,KAAKU,OAAOuD,KAAK,YAEbjE,KAAKM,SACPN,KAAKU,OAAOiH,MAAM3H,KAAKU,OAAOU,MAMhCpB,KAAKU,OAAOoG,GAAG,aAAc9G,KAAKsG,eAAiBtG,MACnDA,KAAKU,OAAOoG,GAAG,wBAAyB9G,KAAKiD,kBAAoBjD,MAG7DA,KAAK6B,WAAWP,gBAAkBtB,KAAKQ,SACzCR,KAAKsB,cAAgBtB,KAAK6B,WAAWP,cACrCtB,KAAKsB,cAAcW,mBAAmBjC,KAAKU,OAAQV,KAAKK,QAI1DL,KAAKU,OAAOU,KAAK0F,GAAG,UAAW9G,KAAKiD,kBAAoBjD,MACxDA,KAAKU,OAAOU,KAAK0F,GAAG,gBAAiB9G,KAAKiD,kBAAmBjD,MAQ/DmB,gBACMnB,KAAKU,QACPV,KAAKU,OAAOkH,MAGhBb,eACE/G,KAAKU,OAAOoG,GAAG,YACX,WACI9G,KAAKmC,cAAc,IAAIC,YAAY,YAAa,CAACM,OAC/C,CAACC,OAAQ3C,UACZA,MACPA,KAAKU,OAAOoG,GAAG,cACX,SAASvD,GACPvD,KAAKD,IAAMwD,EAAExD,IACbC,KAAKmC,cAAc,IAAIC,YAAY,cAAe,CAACM,OAC/C,CAACC,OAAQ3C,UACbA,MACNA,KAAKU,OAAOoG,GAAG,mBACX,SAASvD,GACPvD,KAAKD,IAAMwD,EAAEI,KACb3D,KAAKmC,cAAc,IAAIC,YAAY,mBAAoB,CAACM,OACpD,CAACC,OAAQ3C,UACbA,MAER6H,SACE,GAAI7H,KAAK8H,OAAT,CACA3E,IAAIkB,EAAMrE,KAAKU,OAAOU,KAClB2G,EAAK/H,KAAK8H,OAAOE,QAAQC,KACzBC,EAAKlI,KAAK8H,OAAOK,YAAYF,KAC7BG,EAAcd,EAAEe,OAAOf,EAAEgB,MAAMP,EAAGQ,WAAYR,EAAGS,UAAWlB,EAAEgB,MAAMJ,EAAGK,WAAYL,EAAGM,WACtFC,EAASpE,EAAIxD,QAAQ6H,IAAIC,UAAUP,EAAYQ,WAAU,IAE7DzF,IAAI0F,EAAU7I,KAAK8H,OAAOgB,KAAKD,QAC3BE,EAAU/I,KAAK8H,OAAOgB,KAAKC,QAC/B1E,EAAI2E,QAAQP,EAAQ/B,EAAEuC,WAAWb,EAAa/D,EAAK0E,EAASF,GAAU,CAACK,SAAS,KAElFC,cAActI,EAAU,IACtB,OAAO6F,EAAEyC,cAAcnJ,KAAMa,GAE/BuI,aAAaC,GACX,cAAcA,GACZ,IAAK,SACHA,EAAQC,OACoB,iBAAxBD,EAAQE,MAAM,EAAE,KAAiD,mBAAvBF,EAAQE,OAAO,KAC3DvJ,KAAKwJ,mBAAmB,YAAaH,GAEvC,MACF,IAAK,SACoC,gBAAnCA,EAAQlC,SAASsC,eACnBzJ,KAAK0J,YAAYL,YA7YdzJ"} \ No newline at end of file +{"version":3,"file":"layer.js","sources":["../src/layer.js"],"sourcesContent":["import './leaflet.js'; // a lightly modified version of Leaflet for use as browser module\nimport './mapml.js'; // modified URI to make the function a property of window scope (possibly a bad thing to do).\n\nexport class MapLayer extends HTMLElement {\n static get observedAttributes() {\n return ['src', 'label', 'checked', 'hidden', 'opacity'];\n }\n get src() {\n return this.hasAttribute('src') ? this.getAttribute('src') : '';\n }\n\n set src(val) {\n if (val) {\n this.setAttribute('src', val);\n }\n }\n get label() {\n if (this._layer) return this._layer.getName();\n else return this.hasAttribute('label') ? this.getAttribute('label') : '';\n }\n set label(val) {\n if (val) {\n this.setAttribute('label', val);\n }\n }\n get checked() {\n return this.hasAttribute('checked');\n }\n\n set checked(val) {\n if (val) {\n this.setAttribute('checked', '');\n } else {\n this.removeAttribute('checked');\n }\n }\n\n get hidden() {\n return this.hasAttribute('hidden');\n }\n\n set hidden(val) {\n if (val) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n }\n\n get opacity() {\n // use ?? since 0 is falsy, || would return rhs in that case\n return this._opacity ?? this.getAttribute('opacity');\n }\n\n set opacity(val) {\n if (+val > 1 || +val < 0) return;\n this.setAttribute('opacity', val);\n }\n\n constructor() {\n // Always call super first in constructor\n super();\n }\n disconnectedCallback() {\n // console.log('Custom map element removed from page.');\n // if the map-layer node is removed from the dom, the layer should be\n // removed from the map and the layer control\n\n // this is moved up here so that the layer control doesn't respond\n // to the layer being removed with the _onLayerChange execution\n // that is set up in _attached:\n if (this.hasAttribute('data-moving')) return;\n this._onRemove();\n }\n\n _onRemove() {\n if (this._layer) {\n this._layer.off();\n }\n // if this layer has never been connected, it will not have a _layer\n if (this._layer && this._layer._map) {\n this._layer._map.removeLayer(this._layer);\n }\n\n if (this._layerControl && !this.hidden) {\n this._layerControl.removeLayer(this._layer);\n }\n delete this._layer;\n\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = '';\n }\n }\n\n connectedCallback() {\n if (this.hasAttribute('data-moving')) return;\n const doConnected = this._onAdd.bind(this);\n this.parentElement\n .whenReady()\n .then(() => {\n doConnected();\n })\n .catch(() => {\n throw new Error('Map never became ready');\n });\n }\n\n _onAdd() {\n if (this.getAttribute('src') && !this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n new Promise((resolve, reject) => {\n this.addEventListener(\n 'changestyle',\n function (e) {\n e.stopPropagation();\n this.src = e.detail.src;\n },\n { once: true }\n );\n this.addEventListener(\n 'changeprojection',\n function (e) {\n e.stopPropagation();\n reject(e);\n },\n { once: true }\n );\n let base = this.baseURI ? this.baseURI : document.baseURI;\n\n const headers = new Headers();\n headers.append('Accept', 'text/mapml');\n if (this.src) {\n fetch(this.src, { headers: headers })\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n return response.text();\n })\n .then((mapml) => {\n let content = new DOMParser().parseFromString(mapml, 'text/xml');\n if (\n content.querySelector('parsererror') ||\n !content.querySelector('mapml-')\n ) {\n throw new Error('Parser error');\n }\n if (this._layer) {\n this._onRemove();\n }\n this._layer = M.mapMLLayer(\n new URL(this.src, base).href,\n this,\n content,\n {\n mapprojection: this.parentElement.projection,\n opacity: this.opacity\n }\n );\n this._attachedToMap();\n this._validateDisabled();\n resolve();\n })\n .catch((error) => {\n console.log('Error fetching layer content' + error);\n });\n } else {\n if (this._layer) {\n this._onRemove();\n }\n this._layer = M.mapMLLayer(null, this, null, {\n mapprojection: this.parentElement.projection,\n opacity: this.opacity\n });\n this._attachedToMap();\n this._validateDisabled();\n resolve();\n }\n }).catch((e) => {\n if (e.type === 'changeprojection') {\n this.src = e.detail.href;\n } else {\n console.log(e);\n this.dispatchEvent(\n new CustomEvent('error', { detail: { target: this } })\n );\n }\n });\n }\n _attachedToMap() {\n // set i to the position of this layer element in the set of layers\n var i = 0,\n position = 1;\n for (var nodes = this.parentNode.children; i < nodes.length; i++) {\n if (this.parentNode.children[i].nodeName === 'LAYER-') {\n if (this.parentNode.children[i] === this) {\n position = i + 1;\n } else if (this.parentNode.children[i]._layer) {\n this.parentNode.children[i]._layer.setZIndex(i + 1);\n }\n }\n }\n var proj = this.parentNode.projection\n ? this.parentNode.projection\n : 'OSMTILE';\n L.setOptions(this._layer, {\n zIndex: position,\n mapprojection: proj,\n opacity: window.getComputedStyle(this).opacity\n });\n // make sure the Leaflet layer has a reference to the map\n this._layer._map = this.parentNode._map;\n // notify the layer that it is attached to a map (layer._map)\n this._layer.fire('attached');\n\n if (this.checked) {\n this._layer.addTo(this._layer._map);\n }\n\n // add the handler which toggles the 'checked' property based on the\n // user checking/unchecking the layer from the layer control\n // this must be done *after* the layer is actually added to the map\n this._layer.on('add remove', this._onLayerChange, this);\n this._layer.on('add remove', this._validateDisabled, this);\n // toggle the this.disabled attribute depending on whether the layer\n // is: same prj as map, within view/zoom of map\n this._layer._map.on('moveend layeradd', this._validateDisabled, this);\n\n // if controls option is enabled, insert the layer into the overlays array\n if (this.parentNode._layerControl && !this.hidden) {\n this._layerControl = this.parentNode._layerControl;\n this._layerControl.addOrUpdateOverlay(this._layer, this.label);\n }\n\n // the mapml document associated to this layer can in theory contain many\n // link[@rel=legend] elements with different @type or other attributes;\n // currently only support a single link, don't care about type, lang etc.\n // TODO: add support for full LayerLegend object, and > one link.\n if (this._layer._legendUrl) {\n this.legendLinks = [\n {\n type: 'application/octet-stream',\n href: this._layer._legendUrl,\n rel: 'legend',\n lang: null,\n hreflang: null,\n sizes: null\n }\n ];\n }\n // re-use 'loadedmetadata' event from HTMLMediaElement inteface, applied\n // to MapML extent as metadata\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadedmetadata_event\n this.dispatchEvent(\n new CustomEvent('loadedmetadata', { detail: { target: this } })\n );\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n switch (name) {\n case 'label':\n this.whenReady().then(() => {\n this._layer.setName(newValue);\n });\n break;\n case 'checked':\n if (this._layer) {\n if (typeof newValue === 'string') {\n this.parentElement._map.addLayer(this._layer);\n } else {\n this.parentElement._map.removeLayer(this._layer);\n }\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n break;\n case 'hidden':\n var map = this.parentElement && this.parentElement._map;\n if (map && this.parentElement.controls) {\n if (typeof newValue === 'string') {\n if (this._layer) {\n this.parentElement._layerControl.removeLayer(this._layer);\n }\n } else {\n this._layerControl = this.parentElement._layerControl;\n this._layerControl.addOrUpdateOverlay(this._layer, this.label);\n this._validateDisabled();\n }\n }\n break;\n case 'opacity':\n if (oldValue !== newValue && this._layer) {\n this._opacity = newValue;\n this._layer.changeOpacity(newValue);\n }\n break;\n case 'src':\n if (oldValue !== newValue && this._layer) {\n this._onRemove();\n if (this.isConnected) {\n this._onAdd();\n }\n // the original inline content will not be removed\n // but has NO EFFECT and works as a fallback\n }\n }\n }\n _validateDisabled() {\n setTimeout(() => {\n let layer = this._layer,\n map = layer?._map;\n if (map) {\n let count = 0,\n total = 0,\n layerTypes = [\n '_staticTileLayer',\n '_imageLayer',\n '_mapmlvectors',\n '_templatedLayer'\n ];\n if (layer.validProjection) {\n for (let j = 0; j < layerTypes.length; j++) {\n let type = layerTypes[j];\n if (this.checked && layer[type]) {\n if (type === '_templatedLayer') {\n for (let i = 0; i < layer._properties._mapExtents.length; i++) {\n for (\n let j = 0;\n j <\n layer._properties._mapExtents[i].templatedLayer._templates\n .length;\n j++\n ) {\n if (\n layer._properties._mapExtents[i].templatedLayer\n ._templates[j].rel === 'query'\n )\n continue;\n total++;\n layer._properties._mapExtents[i].removeAttribute(\n 'disabled'\n );\n layer._properties._mapExtents[i].disabled = false;\n if (\n !layer._properties._mapExtents[i].templatedLayer\n ._templates[j].layer.isVisible\n ) {\n count++;\n layer._properties._mapExtents[i].setAttribute(\n 'disabled',\n ''\n );\n layer._properties._mapExtents[i].disabled = true;\n }\n }\n }\n } else {\n total++;\n if (!layer[type].isVisible) count++;\n }\n }\n }\n } else {\n count = 1;\n total = 1;\n }\n\n if (count === total && count !== 0) {\n this.setAttribute('disabled', ''); //set a disabled attribute on the layer element\n this.disabled = true;\n } else {\n //might be better not to disable the layer controls, might want to deselect layer even when its out of bounds\n this.removeAttribute('disabled');\n this.disabled = false;\n }\n map.fire('validate');\n }\n }, 0);\n }\n getOuterHTML() {\n let tempElement = this.cloneNode(true);\n\n if (this.hasAttribute('src')) {\n let newSrc = this._layer.getHref();\n tempElement.setAttribute('src', newSrc);\n }\n if (this.querySelector('map-link')) {\n let mapLinks = tempElement.querySelectorAll('map-link');\n\n mapLinks.forEach((mapLink) => {\n if (mapLink.hasAttribute('href')) {\n mapLink.setAttribute(\n 'href',\n decodeURI(\n new URL(\n mapLink.attributes.href.value,\n this.baseURI ? this.baseURI : document.baseURI\n ).href\n )\n );\n } else if (mapLink.hasAttribute('tref')) {\n mapLink.setAttribute(\n 'tref',\n decodeURI(\n new URL(\n mapLink.attributes.tref.value,\n this.baseURI ? this.baseURI : document.baseURI\n ).href\n )\n );\n }\n });\n }\n\n let outerLayer = tempElement.outerHTML;\n\n tempElement.remove();\n\n return outerLayer;\n }\n\n _onLayerChange() {\n if (this._layer._map) {\n // can't disable observers, have to set a flag telling it where\n // the 'event' comes from: either the api or a user click/tap\n // may not be necessary -> this._apiToggleChecked = false;\n this.checked = this._layer._map.hasLayer(this._layer);\n }\n }\n zoomTo() {\n if (!this.extent) return;\n let map = this.parentElement._map,\n tL = this.extent.topLeft.pcrs,\n bR = this.extent.bottomRight.pcrs,\n layerBounds = L.bounds(\n L.point(tL.horizontal, tL.vertical),\n L.point(bR.horizontal, bR.vertical)\n ),\n center = map.options.crs.unproject(layerBounds.getCenter(true));\n\n let maxZoom = this.extent.zoom.maxZoom,\n minZoom = this.extent.zoom.minZoom;\n map.setView(center, M.getMaxZoom(layerBounds, map, minZoom, maxZoom), {\n animate: false\n });\n }\n mapml2geojson(options = {}) {\n return M.mapml2geojson(this, options);\n }\n pasteFeature(feature) {\n switch (typeof feature) {\n case 'string':\n feature.trim();\n if (\n feature.slice(0, 12) === ''\n ) {\n this.insertAdjacentHTML('beforeend', feature);\n }\n break;\n case 'object':\n if (feature.nodeName.toUpperCase() === 'MAP-FEATURE') {\n this.appendChild(feature);\n }\n }\n }\n whenReady() {\n return new Promise((resolve, reject) => {\n let interval, failureTimer;\n if (this._layer) {\n resolve();\n } else {\n let layerElement = this;\n interval = setInterval(testForLayer, 200, layerElement);\n failureTimer = setTimeout(layerNotDefined, 5000);\n }\n function testForLayer(layerElement) {\n if (layerElement._layer) {\n clearInterval(interval);\n clearTimeout(failureTimer);\n resolve();\n }\n }\n function layerNotDefined() {\n clearInterval(interval);\n clearTimeout(failureTimer);\n reject('Timeout reached waiting for layer to be ready');\n }\n });\n }\n}\n"],"names":["MapLayer","HTMLElement","observedAttributes","src","this","hasAttribute","getAttribute","val","setAttribute","label","_layer","getName","checked","removeAttribute","hidden","opacity","_opacity","constructor","super","disconnectedCallback","_onRemove","off","_map","removeLayer","_layerControl","shadowRoot","innerHTML","connectedCallback","doConnected","_onAdd","bind","parentElement","whenReady","then","catch","Error","attachShadow","mode","Promise","resolve","reject","addEventListener","e","stopPropagation","detail","once","let","base","baseURI","document","headers","Headers","append","fetch","response","ok","status","text","content","DOMParser","parseFromString","mapml","querySelector","M","mapMLLayer","URL","href","mapprojection","projection","_attachedToMap","_validateDisabled","console","log","error","type","dispatchEvent","CustomEvent","target","i","position","nodes","parentNode","children","length","nodeName","setZIndex","proj","L","setOptions","zIndex","window","getComputedStyle","fire","addTo","on","_onLayerChange","addOrUpdateOverlay","_legendUrl","legendLinks","rel","lang","hreflang","sizes","attributeChangedCallback","name","oldValue","newValue","setName","addLayer","Event","bubbles","controls","changeOpacity","isConnected","setTimeout","layer","map","count","total","layerTypes","validProjection","j","_properties","_mapExtents","templatedLayer","_templates","disabled","isVisible","getOuterHTML","tempElement","cloneNode","newSrc","getHref","mapLinks","querySelectorAll","forEach","mapLink","decodeURI","attributes","value","tref","outerLayer","outerHTML","remove","hasLayer","zoomTo","extent","tL","topLeft","pcrs","bR","bottomRight","layerBounds","bounds","point","horizontal","vertical","center","options","crs","unproject","getCenter","maxZoom","zoom","minZoom","setView","getMaxZoom","animate","mapml2geojson","pasteFeature","feature","trim","slice","insertAdjacentHTML","toUpperCase","appendChild","interval","failureTimer","setInterval","layerElement","clearInterval","clearTimeout"],"mappings":";;8CAGaA,iBAAiBC,YAC5BC,gCACE,MAAO,CAAC,MAAO,QAAS,UAAW,SAAU,WAE/CC,UACE,OAAOC,KAAKC,aAAa,OAASD,KAAKE,aAAa,OAAS,GAG/DH,QAAQI,GACFA,GACFH,KAAKI,aAAa,MAAOD,GAG7BE,YACE,OAAIL,KAAKM,OAAeN,KAAKM,OAAOC,UACxBP,KAAKC,aAAa,SAAWD,KAAKE,aAAa,SAAW,GAExEG,UAAUF,GACJA,GACFH,KAAKI,aAAa,QAASD,GAG/BK,cACE,OAAOR,KAAKC,aAAa,WAG3BO,YAAYL,GACNA,EACFH,KAAKI,aAAa,UAAW,IAE7BJ,KAAKS,gBAAgB,WAIzBC,aACE,OAAOV,KAAKC,aAAa,UAG3BS,WAAWP,GACLA,EACFH,KAAKI,aAAa,SAAU,IAE5BJ,KAAKS,gBAAgB,UAIzBE,cAEE,OAAOX,KAAKY,UAAYZ,KAAKE,aAAa,WAG5CS,YAAYR,GACC,GAANA,IAAYA,EAAM,GACvBH,KAAKI,aAAa,UAAWD,GAG/BU,cAEEC,QAEFC,uBAQMf,KAAKC,aAAa,gBACtBD,KAAKgB,YAGPA,YACMhB,KAAKM,QACPN,KAAKM,OAAOW,MAGVjB,KAAKM,QAAUN,KAAKM,OAAOY,MAC7BlB,KAAKM,OAAOY,KAAKC,YAAYnB,KAAKM,QAGhCN,KAAKoB,gBAAkBpB,KAAKU,QAC9BV,KAAKoB,cAAcD,YAAYnB,KAAKM,eAE/BN,KAAKM,OAERN,KAAKqB,aACPrB,KAAKqB,WAAWC,UAAY,IAIhCC,oBACE,IAAIvB,KAAKC,aAAa,eAAtB,CACA,MAAMuB,EAAcxB,KAAKyB,OAAOC,KAAK1B,MACrCA,KAAK2B,cACFC,YACAC,KAAK,KACJL,MAEDM,MAAM,KACL,MAAM,IAAIC,MAAM,6BAItBN,SACMzB,KAAKE,aAAa,SAAWF,KAAKqB,YACpCrB,KAAKgC,aAAa,CAAEC,KAAM,SAE5B,IAAIC,QAAQ,CAACC,EAASC,KACpBpC,KAAKqC,iBACH,cACA,SAAUC,GACRA,EAAEC,kBACFvC,KAAKD,IAAMuC,EAAEE,OAAOzC,KAEtB,CAAE0C,MAAM,IAEVzC,KAAKqC,iBACH,mBACA,SAAUC,GACRA,EAAEC,kBACFH,EAAOE,IAET,CAAEG,MAAM,IAEVC,IAAIC,EAAO3C,KAAK4C,SAAyBC,SAASD,QAElD,MAAME,EAAU,IAAIC,QACpBD,EAAQE,OAAO,SAAU,cACrBhD,KAAKD,IACPkD,MAAMjD,KAAKD,IAAK,CAAE+C,QAASA,IACxBjB,KAAK,IACJ,IAAKqB,EAASC,GACZ,MAAM,IAAIpB,MAAM,uBAAuBmB,EAASE,QAElD,OAAOF,EAASG,SAEjBxB,KAAK,IACJa,IAAIY,GAAU,IAAIC,WAAYC,gBAAgBC,EAAO,YACrD,GACEH,EAAQI,cAAc,iBACrBJ,EAAQI,cAAc,UAEvB,MAAM,IAAI3B,MAAM,gBAEd/B,KAAKM,QACPN,KAAKgB,YAEPhB,KAAKM,OAASqD,EAAEC,WACd,IAAIC,IAAI7D,KAAKD,IAAK4C,GAAMmB,KACxB9D,KACAsD,EACA,CACES,cAAe/D,KAAK2B,cAAcqC,WAClCrD,QAASX,KAAKW,UAGlBX,KAAKiE,iBACLjE,KAAKkE,oBACL/B,MAEDL,MAAM,IACLqC,QAAQC,IAAI,+BAAiCC,MAG7CrE,KAAKM,QACPN,KAAKgB,YAEPhB,KAAKM,OAASqD,EAAEC,WAAW,KAAM5D,KAAM,KAAM,CAC3C+D,cAAe/D,KAAK2B,cAAcqC,WAClCrD,QAASX,KAAKW,UAEhBX,KAAKiE,iBACLjE,KAAKkE,oBACL/B,OAEDL,MAAM,IACQ,qBAAXQ,EAAEgC,KACJtE,KAAKD,IAAMuC,EAAEE,OAAOsB,MAEpBK,QAAQC,IAAI9B,GACZtC,KAAKuE,cACH,IAAIC,YAAY,QAAS,CAAEhC,OAAQ,CAAEiC,OAAQzE,YAKrDiE,iBAIE,IAFA,IAAIS,EAAI,EACNC,EAAW,EACJC,EAAQ5E,KAAK6E,WAAWC,SAAUJ,EAAIE,EAAMG,OAAQL,IACd,WAAzC1E,KAAK6E,WAAWC,SAASJ,GAAGM,WAC1BhF,KAAK6E,WAAWC,SAASJ,KAAO1E,KAClC2E,EAAWD,EAAI,EACN1E,KAAK6E,WAAWC,SAASJ,GAAGpE,QACrCN,KAAK6E,WAAWC,SAASJ,GAAGpE,OAAO2E,UAAUP,EAAI,IAIvD,IAAIQ,EAAOlF,KAAK6E,WAAWb,YAEvB,UACJmB,EAAEC,WAAWpF,KAAKM,OAAQ,CACxB+E,OAAQV,EACRZ,cAAemB,EACfvE,QAAS2E,OAAOC,iBAAiBvF,MAAMW,UAGzCX,KAAKM,OAAOY,KAAOlB,KAAK6E,WAAW3D,KAEnClB,KAAKM,OAAOkF,KAAK,YAEbxF,KAAKQ,SACPR,KAAKM,OAAOmF,MAAMzF,KAAKM,OAAOY,MAMhClB,KAAKM,OAAOoF,GAAG,aAAc1F,KAAK2F,eAAgB3F,MAClDA,KAAKM,OAAOoF,GAAG,aAAc1F,KAAKkE,kBAAmBlE,MAGrDA,KAAKM,OAAOY,KAAKwE,GAAG,mBAAoB1F,KAAKkE,kBAAmBlE,MAG5DA,KAAK6E,WAAWzD,gBAAkBpB,KAAKU,SACzCV,KAAKoB,cAAgBpB,KAAK6E,WAAWzD,cACrCpB,KAAKoB,cAAcwE,mBAAmB5F,KAAKM,OAAQN,KAAKK,QAOtDL,KAAKM,OAAOuF,aACd7F,KAAK8F,YAAc,CACjB,CACExB,KAAM,2BACNR,KAAM9D,KAAKM,OAAOuF,WAClBE,IAAK,SACLC,KAAM,KACNC,SAAU,KACVC,MAAO,QAOblG,KAAKuE,cACH,IAAIC,YAAY,iBAAkB,CAAEhC,OAAQ,CAAEiC,OAAQzE,SAI1DmG,yBAAyBC,EAAMC,EAAUC,GACvC,OAAQF,GACN,IAAK,QACHpG,KAAK4B,YAAYC,KAAK,KACpB7B,KAAKM,OAAOiG,QAAQD,KAEtB,MACF,IAAK,UACCtG,KAAKM,SACiB,iBAAbgG,EACTtG,KAAK2B,cAAcT,KAAKsF,SAASxG,KAAKM,QAEtCN,KAAK2B,cAAcT,KAAKC,YAAYnB,KAAKM,QAE3CN,KAAKuE,cAAc,IAAIkC,MAAM,SAAU,CAAEC,SAAS,MAEpD,MACF,IAAK,SACO1G,KAAK2B,eAAiB3B,KAAK2B,cAAcT,MACxClB,KAAK2B,cAAcgF,WACJ,iBAAbL,EACLtG,KAAKM,QACPN,KAAK2B,cAAcP,cAAcD,YAAYnB,KAAKM,SAGpDN,KAAKoB,cAAgBpB,KAAK2B,cAAcP,cACxCpB,KAAKoB,cAAcwE,mBAAmB5F,KAAKM,OAAQN,KAAKK,OACxDL,KAAKkE,sBAGT,MACF,IAAK,UACCmC,IAAaC,GAAYtG,KAAKM,SAChCN,KAAKY,SAAW0F,EAChBtG,KAAKM,OAAOsG,cAAcN,IAE5B,MACF,IAAK,MACCD,IAAaC,GAAYtG,KAAKM,SAChCN,KAAKgB,YACDhB,KAAK6G,aACP7G,KAAKyB,WAOfyC,oBACE4C,WAAW,KACTpE,IAAIqE,EAAQ/G,KAAKM,OACf0G,EAAMD,GAAO7F,KACf,GAAI8F,EAAK,CACPtE,IAAIuE,EAAQ,EACVC,EAAQ,EACRC,EAAa,CACX,mBACA,cACA,gBACA,mBAEJ,GAAIJ,EAAMK,gBACR,IAAK1E,IAAI2E,EAAI,EAAGA,EAAIF,EAAWpC,OAAQsC,IAAK,CAC1C3E,IAAI4B,EAAO6C,EAAWE,GACtB,GAAIrH,KAAKQ,SAAWuG,EAAMzC,GACxB,GAAa,oBAATA,EACF,IAAK5B,IAAIgC,EAAI,EAAGA,EAAIqC,EAAMO,YAAYC,YAAYxC,OAAQL,IACxD,IACEhC,IAAI2E,EAAI,EACRA,EACAN,EAAMO,YAAYC,YAAY7C,GAAG8C,eAAeC,WAC7C1C,OACHsC,IAI2B,UADzBN,EAAMO,YAAYC,YAAY7C,GAAG8C,eAC9BC,WAAWJ,GAAGtB,MAGnBmB,IACAH,EAAMO,YAAYC,YAAY7C,GAAGjE,gBAC/B,YAEFsG,EAAMO,YAAYC,YAAY7C,GAAGgD,UAAW,EAEzCX,EAAMO,YAAYC,YAAY7C,GAAG8C,eAC/BC,WAAWJ,GAAGN,MAAMY,YAEvBV,IACAF,EAAMO,YAAYC,YAAY7C,GAAGtE,aAC/B,WACA,IAEF2G,EAAMO,YAAYC,YAAY7C,GAAGgD,UAAW,SAKlDR,IACKH,EAAMzC,GAAMqD,WAAWV,SAKlCA,EAAQ,EACRC,EAAQ,EAGND,IAAUC,GAAmB,IAAVD,GACrBjH,KAAKI,aAAa,WAAY,IAC9BJ,KAAK0H,UAAW,IAGhB1H,KAAKS,gBAAgB,YACrBT,KAAK0H,UAAW,GAElBV,EAAIxB,KAAK,cAEV,GAELoC,eACElF,IAAImF,EAAc7H,KAAK8H,WAAU,GAMjC,GAJI9H,KAAKC,aAAa,SAChB8H,EAAS/H,KAAKM,OAAO0H,UACzBH,EAAYzH,aAAa,MAAO2H,IAE9B/H,KAAK0D,cAAc,YAAa,CAClChB,IAAIuF,EAAWJ,EAAYK,iBAAiB,YAE5CD,EAASE,QAAQ,IACXC,EAAQnI,aAAa,QACvBmI,EAAQhI,aACN,OACAiI,UACE,IAAIxE,IACFuE,EAAQE,WAAWxE,KAAKyE,MACxBvI,KAAK4C,SAAyBC,SAASD,SACvCkB,OAGGsE,EAAQnI,aAAa,SAC9BmI,EAAQhI,aACN,OACAiI,UACE,IAAIxE,IACFuE,EAAQE,WAAWE,KAAKD,MACxBvI,KAAK4C,SAAyBC,SAASD,SACvCkB,SAOZpB,IAAI+F,EAAaZ,EAAYa,UAI7B,OAFAb,EAAYc,SAELF,EAGT9C,iBACM3F,KAAKM,OAAOY,OAIdlB,KAAKQ,QAAUR,KAAKM,OAAOY,KAAK0H,SAAS5I,KAAKM,SAGlDuI,SACE,GAAK7I,KAAK8I,OAAV,CACApG,IAAIsE,EAAMhH,KAAK2B,cAAcT,KAC3B6H,EAAK/I,KAAK8I,OAAOE,QAAQC,KACzBC,EAAKlJ,KAAK8I,OAAOK,YAAYF,KAC7BG,EAAcjE,EAAEkE,OACdlE,EAAEmE,MAAMP,EAAGQ,WAAYR,EAAGS,UAC1BrE,EAAEmE,MAAMJ,EAAGK,WAAYL,EAAGM,WAE5BC,EAASzC,EAAI0C,QAAQC,IAAIC,UAAUR,EAAYS,WAAU,IAE3DnH,IAAIoH,EAAU9J,KAAK8I,OAAOiB,KAAKD,QAC7BE,EAAUhK,KAAK8I,OAAOiB,KAAKC,QAC7BhD,EAAIiD,QAAQR,EAAQ9F,EAAEuG,WAAWd,EAAapC,EAAKgD,EAASF,GAAU,CACpEK,SAAS,KAGbC,cAAcV,EAAU,IACtB,OAAO/F,EAAEyG,cAAcpK,KAAM0J,GAE/BW,aAAaC,GACX,cAAeA,GACb,IAAK,SACHA,EAAQC,OAEmB,iBAAzBD,EAAQE,MAAM,EAAG,KACM,mBAAvBF,EAAQE,OAAO,KAEfxK,KAAKyK,mBAAmB,YAAaH,GAEvC,MACF,IAAK,SACoC,gBAAnCA,EAAQtF,SAAS0F,eACnB1K,KAAK2K,YAAYL,IAIzB1I,YACE,OAAO,IAAIM,QAAQ,CAACC,EAASC,KAC3BM,IAAIkI,EAAUC,EACV7K,KAAKM,OACP6B,KAGAyI,EAAWE,YAGb,SAAsBC,GAChBA,EAAazK,SACf0K,cAAcJ,GACdK,aAAaJ,GACb1I,MAPmC,IADlBnC,MAEnB6K,EAAe/D,WASjB,WACEkE,cAAcJ,GACdK,aAAaJ,GACbzI,EAAO,kDAZoC,gBAvdtCxC"} \ No newline at end of file diff --git a/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js b/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js index 9382eb551e4..d77ba4f8c0b 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js +++ b/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js @@ -1,34 +1,4 @@ -/*! @maps4html/web-map-custom-element 08-04-2023 */ -/* @preserve -/* (c) 2023 Open Source Geospatial Foundation - all rights reserved - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - * Leaflet 1.9.3, a JS library for interactive maps. http://leafletjs.com - * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade All rights reserved. - * proj4 Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf - * proj4leaflet Copyright (c) 2012, Kartena AB - * leaflet-locatecontrol Copyright (c) 2023 Dominik Moritz - * Leaflet Fullscreen control Copyright (c) 2015 Mapbox - * Leaflet Context Menu Copyright (c) 2017 Adam Ratcliffe -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: +/*! @maps4html/web-map-custom-element 27-09-2023 */ - 1. Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - 2. 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. - -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. - */ -!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var i,e,s=1,n=arguments.length;s=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=B(t);var i=this.min,e=this.max,s=t.min,n=t.max,t=n.x>=i.x&&s.x<=e.x,e=n.y>=i.y&&s.y<=e.y;return t&&e},overlaps:function(t){t=B(t);var i=this.min,e=this.max,s=t.min,n=t.max,t=n.x>i.x&&s.xi.y&&s.y=s.lat&&e.lat<=n.lat&&i.lng>=s.lng&&e.lng<=n.lng},intersects:function(t){t=R(t);var i=this._southWest,e=this._northEast,s=t.getSouthWest(),n=t.getNorthEast(),t=n.lat>=i.lat&&s.lat<=e.lat,e=n.lng>=i.lng&&s.lng<=e.lng;return t&&e},overlaps:function(t){t=R(t);var i=this._southWest,e=this._northEast,s=t.getSouthWest(),n=t.getNorthEast(),t=n.lat>i.lat&&s.lati.lng&&s.lng","http://www.w3.org/2000/svg"===(Tt.firstChild&&Tt.firstChild.namespaceURI));function St(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var Et={ie:Y,ielt9:$,edge:tt,webkit:it,android:et,android23:st,androidStock:ot,opera:at,chrome:rt,gecko:ht,safari:lt,phantom:ct,opera12:ut,win:dt,ie3d:_t,webkit3d:pt,gecko3d:mt,any3d:ft,mobile:gt,mobileWebkit:vt,mobileWebkit3d:yt,msPointer:Mt,pointer:xt,touch:bt,touchNative:wt,mobileOpera:Pt,mobileGecko:F,retina:Lt,passiveEvents:Ct,canvas:nt,svg:Q,vml:!Q&&function(){try{var t=document.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}(),inlineSvg:Tt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},kt=Et.msPointer?"MSPointerDown":"pointerdown",zt=Et.msPointer?"MSPointerMove":"pointermove",At=Et.msPointer?"MSPointerUp":"pointerup",Ot=Et.msPointer?"MSPointerCancel":"pointercancel",It={touchstart:kt,touchmove:zt,touchend:At,touchcancel:Ot},Zt={touchstart:function(t,i){i.MSPOINTER_TYPE_TOUCH&&i.pointerType===i.MSPOINTER_TYPE_TOUCH&&Oi(i);Gt(t,i)},touchmove:Gt,touchend:Gt,touchcancel:Gt},Bt={},Nt=!1;function Rt(t,i,e){return"touchstart"===i&&(Nt||(document.addEventListener(kt,jt,!0),document.addEventListener(zt,Dt,!0),document.addEventListener(At,qt,!0),document.addEventListener(Ot,qt,!0),Nt=!0)),Zt[i]?(e=Zt[i].bind(this,e),t.addEventListener(It[i],e,!1),e):(console.warn("wrong event specified:",i),c)}function jt(t){Bt[t.pointerId]=t}function Dt(t){Bt[t.pointerId]&&(Bt[t.pointerId]=t)}function qt(t){delete Bt[t.pointerId]}function Gt(t,i){if(i.pointerType!==(i.MSPOINTER_TYPE_MOUSE||"mouse")){for(var e in i.touches=[],Bt)i.touches.push(Bt[e]);i.changedTouches=[i],t(i)}}var Ft=200;function Ht(t,e){t.addEventListener("dblclick",e);var s,n=0;function i(t){var i;1===t.detail?"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((i=Zi(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!i.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((i=Date.now())-n<=Ft?2===++s&&e(function(t){var i,e,s={};for(e in t)i=t[e],s[e]=i&&i.bind?i.bind(t):i;return(t=s).type="dblclick",s.detail=2,s.isTrusted=!1,s._simulated=!0,s}(t)):s=1,n=i)):s=t.detail}return t.addEventListener("click",i),{dblclick:e,simDblclick:i}}var Ut,Wt,Vt,Kt,Xt,Jt,Qt=_i(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),Yt=_i(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),$t="webkitTransition"===Yt||"OTransition"===Yt?Yt+"End":"transitionend";function ti(t){return"string"==typeof t?document.getElementById(t):t}function ii(t,i){var e=t.style[i]||t.currentStyle&&t.currentStyle[i];return"auto"===(e=(!e||"auto"===e)&&document.defaultView?(t=document.defaultView.getComputedStyle(t,null))?t[i]:null:e)?null:e}function ei(t,i,e){t=document.createElement(t);return t.className=i||"",e&&e.appendChild(t),t}function si(t){var i=t.parentNode;i&&i.removeChild(t)}function ni(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function oi(t){var i=t.parentNode;i&&i.lastChild!==t&&i.appendChild(t)}function ai(t){var i=t.parentNode;i&&i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function ri(t,i){if(void 0!==t.classList)return t.classList.contains(i);t=ui(t);return 0this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),t=this._limitCenter(e,this._zoom,R(t));return e.equals(t)||this.panTo(t,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e=I((i=i||{}).paddingTopLeft||i.padding||[0,0]),s=I(i.paddingBottomRight||i.padding||[0,0]),n=this.project(this.getCenter()),o=this.project(t),t=this.getPixelBounds(),e=B([t.min.add(e),t.max.subtract(s)]),t=e.getSize();return e.contains(o)||(this._enforcingBounds=!0,s=o.subtract(e.getCenter()),t=e.extend(o).getSize().subtract(t),n.x+=s.x<0?-t.x:t.x,n.y+=s.y<0?-t.y:t.y,this.panTo(this.unproject(n),i),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var i=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var e=this.getSize(),s=i.divideBy(2).round(),n=e.divideBy(2).round(),n=s.subtract(n);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(r(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:i,newSize:e})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=l({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var i=r(this._handleGeolocationResponse,this),e=r(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(i,e,t):navigator.geolocation.getCurrentPosition(i,e,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i;this._container._leaflet_id&&(i=t.code,t=t.message||(1===i?"permission denied":2===i?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:i,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var i,e=new j(t.coords.latitude,t.coords.longitude),s=e.toBounds(2*t.coords.accuracy),n=this._locateOptions;n.setView&&(i=this.getBoundsZoom(s),this.setView(e,n.maxZoom?Math.min(i,n.maxZoom):i));var o,a={latlng:e,bounds:s,timestamp:t.timestamp};for(o in t.coords)"number"==typeof t.coords[o]&&(a[o]=t.coords[o]);this.fire("locationfound",a)}},addHandler:function(t,i){if(!i)return this;i=this[t]=new i(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),si(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(T(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)si(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){i=ei("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),i||this._mapPane);return t&&(this._panes[t]=i),i},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new N(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=R(t),e=I(e||[0,0]);var s=this.getZoom()||0,n=this.getMinZoom(),o=this.getMaxZoom(),a=t.getNorthWest(),r=t.getSouthEast(),t=this.getSize().subtract(e),e=B(this.project(r,s),this.project(a,s)).getSize(),r=Et.any3d?this.options.zoomSnap:1,a=t.x/e.x,e=t.y/e.y,e=i?Math.max(a,e):Math.min(a,e),s=this.getScaleZoom(e,s);return r&&(s=Math.round(s/(r/100))*(r/100),s=i?Math.ceil(s/r)*r:Math.floor(s/r)*r),Math.max(n,Math.min(o,s))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new A(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){i=this._getTopLeftPoint(t,i);return new Z(i,i.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;i=e.zoom(t*e.scale(i));return isNaN(i)?1/0:i},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(D(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(I(t),i)},layerPointToLatLng:function(t){t=I(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(D(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(D(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(R(t))},distance:function(t,i){return this.options.crs.distance(D(t),D(i))},containerPointToLayerPoint:function(t){return I(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return I(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(I(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(D(t)))},mouseEventToContainerPoint:function(t){return Bi(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=ti(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");bi(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&Et.any3d,hi(t,"leaflet-container"+(Et.touch?" leaflet-touch":"")+(Et.retina?" leaflet-retina":"")+(Et.ielt9?" leaflet-oldie":"")+(Et.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=ii(t,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&"sticky"!==i&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),mi(this._mapPane,new A(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(hi(t.markerPane,"leaflet-zoom-hide"),hi(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,i,e){mi(this._mapPane,new A(0,0));var s=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire("viewprereset");var n=this._zoom!==i;this._moveStart(n,e)._move(t,i)._moveEnd(n),this.fire("viewreset"),s&&this.fire("load")},_moveStart:function(t,i){return t&&this.fire("zoomstart"),i||this.fire("movestart"),this},_move:function(t,i,e,s){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),s?e&&e.pinch&&this.fire("zoom",e):((n||e&&e.pinch)&&this.fire("zoom",e),this.fire("move",e)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return T(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){mi(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var i=t?Li:bi;i((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&i(window,"resize",this._onResize,this),Et.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){T(this._resizeRequest),this._resizeRequest=C(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,s=[],n="mouseout"===i||"mouseover"===i,o=t.target||t.srcElement,a=!1;o;){if((e=this._targets[h(o)])&&("click"===i||"preclick"===i)&&this._draggableMoved(e)){a=!0;break}if(e&&e.listens(i,!0)){if(n&&!ji(o,t))break;if(s.push(e),n)break}if(o===this._container)break;o=o.parentNode}return s=!(s.length||a||n)&&this.listens(i,!0)?[this]:s},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var i,e=t.target||t.srcElement;!this._loaded||e._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(e)||("mousedown"===(i=t.type)&&yi(e),this._fireDOMEvent(t,i))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,e));var s=this._findEventTargets(t,i);if(e){for(var n=[],o=0;othis.options.zoomAnimationThreshold)return!1;var s=this.getZoomScale(i),s=this._getCenterOffset(t)._divideBy(1-1/s);return!(!0!==e.animate&&!this.getSize().contains(s))&&(C(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,s){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,hi(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:s}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(r(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&li(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Gi(t){return new Fi(t)}var Fi=E.extend({options:{position:"topright"},initialize:function(t){_(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),t=t._controlCorners[e];return hi(i,"leaflet-control"),-1!==e.indexOf("bottom")?t.insertBefore(i,t.firstChild):t.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(si(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",i=document.createElement("div");return i.innerHTML=t,i.firstChild},_addItem:function(t){var i,e=document.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers_"+h(this),s),this._layerControlInputs.push(i),i.layerId=h(t.layer),bi(i,"click",this._onInputClick,this);var n=document.createElement("span");n.innerHTML=" "+t.name;s=document.createElement("span");return e.appendChild(s),s.appendChild(i),s.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,s=[],n=[];this._handlingClick=!0;for(var o=e.length-1;0<=o;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.checked?s.push(i):t.checked||n.push(i);for(o=0;oi.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section;bi(t,"click",Oi),this.expand(),setTimeout(function(){Li(t,"click",Oi)})}}),Ui=Fi.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=ei("div",i+" leaflet-bar"),s=this.options;return this._zoomInButton=this._createButton(s.zoomInText,s.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(s.zoomOutText,s.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,s,n){s=ei("a",e,s);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Ai(s),bi(s,"click",Ii),bi(s,"click",n,this),bi(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";li(this._zoomInButton,i),li(this._zoomOutButton,i),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(hi(this._zoomOutButton,i),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(hi(this._zoomInButton,i),this._zoomInButton.setAttribute("aria-disabled","true"))}});qi.mergeOptions({zoomControl:!0}),qi.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Ui,this.addControl(this.zoomControl))});var Wi=Fi.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=ei("div",i),s=this.options;return this._addScales(s,i+"-line",e),t.on(s.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ei("div",i,e)),t.imperial&&(this._iScale=ei("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,i=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(i)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t);this._updateScale(this._mScale,i<1e3?i+" m":i/1e3+" km",i/t)},_updateImperial:function(t){var i,e=3.2808399*t;5280'+(Et.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){_(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=ei("div","leaflet-control-attribution"),Ai(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},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},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,i=[];for(t in this._attributions)this._attributions[t]&&i.push(t);var e=[];this.options.prefix&&e.push(this.options.prefix),i.length&&e.push(i.join(", ")),this._container.innerHTML=e.join(' ')}}});qi.mergeOptions({attributionControl:!0}),qi.addInitHook(function(){this.options.attributionControl&&(new Vi).addTo(this)});Fi.Layers=Hi,Fi.Zoom=Ui,Fi.Scale=Wi,Fi.Attribution=Vi,Gi.layers=function(t,i,e){return new Hi(t,i,e)},Gi.zoom=function(t){return new Ui(t)},Gi.scale=function(t){return new Wi(t)},Gi.attribution=function(t){return new Vi(t)};xt=E.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}});xt.addTo=function(t,i){return t.addHandler(i,this),this};var Ki,bt={Events:k},Xi=Et.touch?"touchstart mousedown":"mousedown",Ji=z.extend({options:{clickTolerance:3},initialize:function(t,i,e,s){_(this,s),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(bi(this._dragStartTarget,Xi,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Ji._dragging===this&&this.finishDrag(!0),Li(this._dragStartTarget,Xi,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var i,e;this._enabled&&(this._moved=!1,ri(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Ji._dragging===this&&this.finishDrag():Ji._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Ji._dragging=this)._preventOutline&&yi(this._element),gi(),Vt(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=xi(this._element),this._startPoint=new A(i.clientX,i.clientY),this._startPos=fi(this._element),this._parentScale=wi(e),t="mousedown"===t.type,bi(document,t?"mousemove":"touchmove",this._onMove,this),bi(document,t?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var i;this._enabled&&(t.touches&&1i&&(e.push(t[s]),n=s);ni.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function ee(t,i,e,s){var n=i.x,o=i.y,a=e.x-n,r=e.y-o,i=a*a+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=s.y>t.y&&t.x<(s.x-e.x)*(t.y-e.y)/(s.y-e.y)+e.x&&(l=!l);return l||ve.prototype._containsPoint.call(this,t,!0)}});var Me=ce.extend({initialize:function(t,i){_(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,s,n=g(t)?t:t.features;if(n){for(i=0,e=n.length;io.x&&(a=e.x+r-o.x+n.x),e.x-a-s.x<(r=0)&&(a=e.x-s.x),e.y+i+n.y>o.y&&(r=e.y+i-o.y+n.y),e.y-r-s.y<0&&(r=e.y-s.y),(a||r)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([a,r]))))},_getAnchor:function(){return I(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});qi.mergeOptions({closePopupOnClick:!0}),qi.include({openPopup:function(t,i,e){return this._initOverlay(Ie,t,i,e).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),k.include({bindPopup:function(t,i){return this._popup=this._initOverlay(Ie,this._popup,t,i),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ce||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i;this._popup&&this._map&&(Ii(t),i=t.layer||t.target,this._popup._source!==i||i instanceof me?(this._popup._source=i,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var Ze=Oe.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Oe.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Oe.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Oe.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=ei("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i,e=this._map,s=this._container,n=e.latLngToContainerPoint(e.getCenter()),o=e.layerPointToContainerPoint(t),a=this.options.direction,r=s.offsetWidth,h=s.offsetHeight,l=I(this.options.offset),e=this._getAnchor(),h="top"===a?(i=r/2,h):"bottom"===a?(i=r/2,0):(i="center"===a?r/2:"right"===a?0:"left"===a?r:o.xthis.options.maxZoom||sthis.options.maxZoom||void 0!==this.options.minZoom&&ne.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;t=this._tileCoordsToBounds(t);return R(this.options.bounds).overlaps(t)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),s=t.scaleBy(e),e=s.add(e);return[i.unproject(s,t.z),i.unproject(e,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new N(t[0],t[1]);return t=!this.options.noWrap?this._map.wrapLatLngBounds(t):t},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),t=new A(+i[0],+i[1]);return t.z=+i[2],t},_removeTile:function(t){var i=this._tiles[t];i&&(si(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){hi(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=c,t.onmousemove=c,Et.ielt9&&this.options.opacity<1&&di(t,this.options.opacity)},_addTile:function(t,i){var e=this._getTilePos(t),s=this._tileCoordsToKey(t),n=this.createTile(this._wrapCoords(t),r(this._tileReady,this,t));this._initTile(n),this.createTile.length<2&&C(r(this._tileReady,this,t,null,n)),mi(n,e),this._tiles[s]={el:n,coords:t,current:!0},i.appendChild(n),this.fire("tileloadstart",{tile:n,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var s=this._tileCoordsToKey(t);(e=this._tiles[s])&&(e.loaded=+new Date,this._map._fadeAnimated?(di(e.el,0),T(this._fadeFrame),this._fadeFrame=C(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(hi(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),Et.ielt9||!this._map._fadeAnimated?C(this._pruneTiles,this):setTimeout(r(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new A(this._wrapX?n(t.x,this._wrapX):t.x,this._wrapY?n(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new Z(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Re=Ne.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,i){this._url=t,(i=_(this,i)).detectRetina&&Et.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),nt={_initContainer:function(){this._container=ei("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(qe.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=He("shape");hi(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=He("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;si(i),t.removeInteractiveTarget(i),delete this._layers[h(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,s=t.options,n=t._container;n.stroked=!!s.stroke,n.filled=!!s.fill,s.stroke?(i=i||(t._stroke=He("stroke")),n.appendChild(i),i.weight=s.weight+"px",i.color=s.color,i.opacity=s.opacity,s.dashArray?i.dashStyle=g(s.dashArray)?s.dashArray.join(" "):s.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=s.lineCap.replace("butt","flat"),i.joinstyle=s.lineJoin):i&&(n.removeChild(i),t._stroke=null),s.fill?(e=e||(t._fill=He("fill")),n.appendChild(e),e.color=s.fillColor||s.color,e.opacity=s.fillOpacity):e&&(n.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),s=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+s+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){oi(t._container)},_bringToBack:function(t){ai(t._container)}},Ue=Et.vml?He:X,We=qe.extend({_initContainer:function(){this._container=Ue("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=Ue("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){si(this._container),Li(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,i,e;this._map._animatingZoom&&this._bounds||(qe.prototype._update.call(this),i=(t=this._bounds).getSize(),e=this._container,this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),mi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update"))},_initPath:function(t){var i=t._path=Ue("path");t.options.className&&hi(i,t.options.className),t.options.interactive&&hi(i,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){si(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,t=t.options;i&&(t.stroke?(i.setAttribute("stroke",t.color),i.setAttribute("stroke-opacity",t.opacity),i.setAttribute("stroke-width",t.weight),i.setAttribute("stroke-linecap",t.lineCap),i.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?i.setAttribute("stroke-dasharray",t.dashArray):i.removeAttribute("stroke-dasharray"),t.dashOffset?i.setAttribute("stroke-dashoffset",t.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),t.fill?(i.setAttribute("fill",t.fillColor||t.color),i.setAttribute("fill-opacity",t.fillOpacity),i.setAttribute("fill-rule",t.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,J(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),s="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+s+2*e+",0 "+s+2*-e+",0 ";this._setPath(t,e)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){oi(t._path)},_bringToBack:function(t){ai(t._path)}});function Ve(t){return Et.svg||Et.vml?new We(t):null}Et.vml&&We.include(nt),qi.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&Fe(t)||Ve(t)}});var Ke=ye.extend({initialize:function(t,i){ye.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=R(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});We.create=Ue,We.pointsToPath=J,Me.geometryToLayer=xe,Me.coordsToLatLng=be,Me.coordsToLatLngs=Pe,Me.latLngToCoords=Le,Me.latLngsToCoords=Ce,Me.getFeature=Te,Me.asFeature=Se,qi.mergeOptions({boxZoom:!0});F=xt.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){bi(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Li(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){si(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Vt(),gi(),this._startPoint=this._map.mouseEventToContainerPoint(t),bi(document,{contextmenu:Ii,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ei("div","leaflet-zoom-box",this._container),hi(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new Z(this._point,this._startPoint),t=i.getSize();mi(this._box,i.min),this._box.style.width=t.x+"px",this._box.style.height=t.y+"px"},_finish:function(){this._moved&&(si(this._box),li(this._container,"leaflet-crosshair")),Kt(),vi(),Li(document,{contextmenu:Ii,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(r(this._resetState,this),0),t=new N(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}});qi.addInitHook("addHandler","boxZoom",F),qi.mergeOptions({doubleClickZoom:!0});Q=xt.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),s=i.options.zoomDelta,s=t.originalEvent.shiftKey?e-s:e+s;"center"===i.options.doubleClickZoom?i.setZoom(s):i.setZoomAround(t.containerPoint,s)}});qi.addInitHook("addHandler","doubleClickZoom",Q),qi.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});V=xt.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Ji(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),hi(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){li(this._map._container,"leaflet-grab"),li(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,i=this._map;i._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=R(this._map.options.maxBounds),this._offsetLimit=B(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,i.fire("movestart").fire("dragstart"),i.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var i,e;this._map.options.inertia&&(i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(e),this._times.push(i),this._prunePositions(i)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,s=this._draggable._newPos.x,n=(s-i+e)%t+i-e,i=(s+i+e)%t-i-e,i=Math.abs(n+e)i.getMaxZoom()&&1=this.text.length)return;t=this.text[this.place++]}switch(this.state){case 1:return this.neutral(t);case 2:return this.keyword(t);case 4:return this.quoted(t);case 5:return this.afterquote(t);case 3:return this.number(t);case-1:return}},C.prototype.afterquote=function(t){if('"'===t)return this.word+='"',void(this.state=4);if(d.test(t))return this.word=this.word.trim(),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in afterquote yet, index '+this.place)},C.prototype.afterItem=function(t){if(","===t)return null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=1);"]"===t&&(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=1,this.currentObject=this.stack.pop(),this.currentObject||(this.state=-1))},C.prototype.number=function(t){if(!L.test(t)){if(d.test(t))return this.word=parseFloat(this.word),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in number yet, index '+this.place)}this.word+=t},C.prototype.quoted=function(t){'"'!==t?this.word+=t:this.state=5},C.prototype.keyword=function(t){if(u.test(t))this.word+=t;else{if("["===t){var i=[];return i.push(this.word),this.level++,null===this.root?this.root=i:this.currentObject.push(i),this.stack.push(this.currentObject),this.currentObject=i,void(this.state=1)}if(!d.test(t))throw new Error("havn't handled \""+t+'" in keyword yet, index '+this.place);this.afterItem(t)}},C.prototype.neutral=function(t){if(s.test(t))return this.word=t,void(this.state=2);if('"'===t)return this.word="",void(this.state=4);if(L.test(t))return this.word=t,void(this.state=3);if(!d.test(t))throw new Error("havn't handled \""+t+'" in neutral yet, index '+this.place);this.afterItem(t)},C.prototype.output=function(){for(;this.placeMath.PI&&(s-=2*Math.PI),t=Math.sin(n),n=Math.cos(n),{x:((e=e/Math.sqrt(1-i*(t*t)))+o)*n*Math.cos(s),y:(e+o)*n*Math.sin(s),z:(e*(1-i)+o)*t}}function Y(t,i,e,s){var n,o,a,r,h,l,c,u,d,_,p,m=1e-12,f=t.x,g=t.y,v=t.z||0,y=Math.sqrt(f*f+g*g),M=Math.sqrt(f*f+g*g+v*v);if(y/ex?Math.tan(e):0,c=Math.pow(i,2),u=Math.pow(c,2),d=1-this.es*Math.pow(n,2);a/=Math.sqrt(d);i=qt(e,n,o,this.en),d=this.a*(this.k0*a*(1+r/6*(1-c+h+r/20*(5-18*c+u+14*h-58*c*h+r/42*(61+179*u-u*c-479*c)))))+this.x0,u=this.a*(this.k0*(i-this.ml0+n*s*a/2*(1+r/12*(5-c+9*h+4*l+r/30*(61+u-58*c+270*h-330*c*h+r/56*(1385+543*u-u*c-3111*c))))))+this.y0}else{c=o*Math.sin(s);if(Math.abs(Math.abs(c)-1)x?Math.tan(i):0,s=this.ep2*Math.pow(e,2),l=Math.pow(s,2),n=Math.pow(r,2),o=Math.pow(n,2),h=1-this.es*Math.pow(a,2),a=c*Math.sqrt(h)/this.k0,l=i-(h*=r)*(r=Math.pow(a,2))/(1-this.es)*.5*(1-r/12*(5+3*n-9*s*n+s-4*l-r/30*(61+90*n-252*s*n+45*o+46*s-r/56*(1385+3633*n+4095*o+1574*o*n)))),q(this.long0+a*(1-r/6*(1+2*n+s-r/20*(5+28*n+24*o+8*s*n+6*s-r/42*(61+662*n+1320*o+720*o*n))))/e)):(l=g*D(u),0)):(c=.5*((d=Math.exp(c/this.k0))-1/d),d=this.lat0+u/this.k0,d=Math.cos(d),h=Math.sqrt((1-Math.pow(d,2))/(1+Math.pow(c,2))),l=Math.asin(h),u<0&&(l=-l),0==c&&0===d?0:q(Math.atan2(c,d)+this.long0));return t.x=d,t.y=l,t},names:["Transverse_Mercator","Transverse Mercator","tmerc"]},Wt=function(t){var t=Math.exp(t);return t=(t-1/t)/2},Vt=function(t,i){t=Math.abs(t),i=Math.abs(i);var e=Math.max(t,i),i=Math.min(t,i)/(e||1);return e*Math.sqrt(1+Math.pow(i,2))},Kt=function(t){var i=1+t,e=i-1;return 0==e?t:t*Math.log(i)/e},Xt=function(t){var t=Math.exp(t);return t=(t+1/t)/2};var Jt={init:function(){if(void 0===this.es||this.es<=0)throw new Error("incorrect elliptical usage");this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var t=(i=this.es/(1+Math.sqrt(1-this.es)))/(2-i),i=t;this.cgb[0]=t*(2+t*(-2/3+t*(t*(116/45+t*(26/45+-2854/675*t))-2))),this.cbg[0]=t*(t*(2/3+t*(4/3+t*(-82/45+t*(32/45+4642/4725*t))))-2),this.cgb[1]=(i*=t)*(7/3+t*(t*(-227/45+t*(2704/315+2323/945*t))-1.6)),this.cbg[1]=i*(5/3+t*(-16/15+t*(-13/9+t*(904/315+-1522/945*t)))),this.cgb[2]=(i*=t)*(56/15+t*(-136/35+t*(-1262/105+73814/2835*t))),this.cbg[2]=i*(-26/15+t*(34/21+t*(1.6+-12686/2835*t))),this.cgb[3]=(i*=t)*(4279/630+t*(-332/35+-399572/14175*t)),this.cbg[3]=i*(1237/630+t*(-24832/14175*t-2.4)),this.cgb[4]=(i*=t)*(4174/315+-144838/6237*t),this.cbg[4]=i*(-734/315+109598/31185*t),this.cgb[5]=601676/22275*(i*=t),this.cbg[5]=444337/155925*i,i=Math.pow(t,2),this.Qn=this.k0/(1+t)*(1+i*(.25+i*(1/64+i/256))),this.utg[0]=t*(t*(2/3+t*(-37/96+t*(1/360+t*(81/512+-96199/604800*t))))-.5),this.gtu[0]=t*(.5+t*(-2/3+t*(5/16+t*(41/180+t*(-127/288+7891/37800*t))))),this.utg[1]=i*(-1/48+t*(-1/15+t*(437/1440+t*(-46/105+1118711/3870720*t)))),this.gtu[1]=i*(13/48+t*(t*(557/1440+t*(281/630+-1983433/1935360*t))-.6)),this.utg[2]=(i*=t)*(-17/480+t*(37/840+t*(209/4480+-5569/90720*t))),this.gtu[2]=i*(61/240+t*(-103/140+t*(15061/26880+167603/181440*t))),this.utg[3]=(i*=t)*(-4397/161280+t*(11/504+830251/7257600*t)),this.gtu[3]=i*(49561/161280+t*(-179/168+6601661/7257600*t)),this.utg[4]=(i*=t)*(-4583/161280+108847/3991680*t),this.gtu[4]=i*(34729/80640+-3418889/1995840*t),this.utg[5]=-.03233083094085698*(i*=t),this.gtu[5]=.6650675310896665*i,i=Ft(this.cbg,this.lat0),this.Zb=-this.Qn*(i+function(t,i){for(var e,s=2*Math.cos(i),n=t.length-1,o=t[n],a=0;0<=--n;)e=s*o-a+t[n],a=o,o=e;return Math.sin(i)*e}(this.gtu,2*i))},forward:function(t){var i=q(t.x-this.long0),e=t.y,e=Ft(this.cbg,e),s=Math.sin(e),n=Math.cos(e),o=Math.sin(i),a=Math.cos(i);e=Math.atan2(s,a*n),i=Math.atan2(o*n,Vt(s,n*a)),n=Math.tan(i),a=Math.abs(n),a=Kt(a*(1+a/(Vt(1,a)+1)));var r,a=Ht(this.gtu,2*e,2*(i=n<0?-a:a));return e+=a[0],i+=a[1],e=Math.abs(i)<=2.623395162778?(r=this.a*(this.Qn*i)+this.x0,this.a*(this.Qn*e+this.Zb)+this.y0):r=1/0,t.x=r,t.y=e,t},inverse:function(t){var i,e,s,n,o=(t.x-this.x0)*(1/this.a),a=(t.y-this.y0)*(1/this.a);return a=(a-this.Zb)/this.Qn,o/=this.Qn,a=Math.abs(o)<=2.623395162778?(a+=(n=Ht(this.utg,2*a,2*o))[0],o+=n[1],o=Math.atan(Wt(o)),i=Math.sin(a),e=Math.cos(a),s=Math.sin(o),n=Math.cos(o),a=Math.atan2(i*n,Vt(s,n*e)),o=Math.atan2(s,n*e),e=q(o+this.long0),Ft(this.cgb,a)):e=1/0,t.x=e,t.y=a,t},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc"]};function Qt(t,i){return Math.pow((1-t)/(1+t),i)}var Yt={init:function(){var t=function(t,i){if(void 0===t){if((t=Math.floor(30*(q(i)+Math.PI)/Math.PI)+1)<0)return 0;if(60x?this.ns=Math.log(i/s)/Math.log(e/n):this.ns=t,isNaN(this.ns)&&(this.ns=t),this.f0=i/(this.ns*Math.pow(e,this.ns)),this.rh=this.a*this.f0*Math.pow(o,this.ns),this.title||(this.title="Lambert Conformal Conic"))},forward:function(t){var i=t.x,e=t.y;Math.abs(2*Math.abs(e)-Math.PI)<=x&&(e=D(e)*(g-2*x));var s,n=Math.abs(Math.abs(e)-g);if(xx?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(t){var i=t.x,e=t.y;this.sin_phi=Math.sin(e),this.cos_phi=Math.cos(e);var s=pi(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*s)/this.ns0,s=this.ns0*q(i-this.long0),i=e*Math.sin(s)+this.x0,s=this.rh-e*Math.cos(s)+this.y0;return t.x=i,t.y=s,t},inverse:function(t){var i,e,s,n;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,e=0<=this.ns0?(i=Math.sqrt(t.x*t.x+t.y*t.y),1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),-1),(s=0)!==i&&(s=Math.atan2(e*t.x,e*t.y)),e=i*this.ns0/this.a,n=this.sphere?Math.asin((this.c-e*e)/(2*this.ns0)):(n=(this.c-e*e)/this.ns0,this.phi1z(this.e3,n)),s=q(s/this.ns0+this.long0),t.x=s,t.y=n,t},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(t,i){var e,s,n,o=wi(.5*i);if(tMath.PI&&(e=Math.PI),s=(2*i+Math.sin(2*i))/Math.PI,12*g*this.a?void 0:(r=i/this.a,h=Math.sin(r),a=Math.cos(r),e=this.long0,Math.abs(i)<=x?s=this.lat0:(s=wi(a*this.sin_p12+t.y*h*this.cos_p12/i),o=Math.abs(this.lat0)-g,e=Math.abs(o)<=x?0<=this.lat0?q(this.long0+Math.atan2(t.x,-t.y)):q(this.long0-Math.atan2(-t.x,t.y)):q(this.long0+Math.atan2(t.x*h,i*this.cos_p12*a-t.y*this.sin_p12*h))),t.x=e,t.y=s,t):(r=ai(this.es),o=ri(this.es),a=hi(this.es),h=li(this.es),Math.abs(this.sin_p12-1)<=x?(n=this.a*oi(r,o,a,h,g),i=Math.sqrt(t.x*t.x+t.y*t.y),s=di((n-i)/this.a,r,o,a,h),e=q(this.long0+Math.atan2(t.x,-1*t.y))):Math.abs(this.sin_p12+1)<=x?(n=this.a*oi(r,o,a,h,g),i=Math.sqrt(t.x*t.x+t.y*t.y),s=di((i-n)/this.a,r,o,a,h),e=q(this.long0+Math.atan2(t.x,t.y))):(i=Math.sqrt(t.x*t.x+t.y*t.y),n=Math.atan2(t.x,t.y),r=ci(this.a,this.e,this.sin_p12),o=Math.cos(n),h=-(a=this.e*this.cos_p12*o)*a/(1-this.es),a=3*this.es*(1-h)*this.sin_p12*this.cos_p12*o/(1-this.es),r=1-h*(h=(r=i/r)-h*(1+h)*Math.pow(r,3)/6-a*(1+3*h)*Math.pow(r,4)/24)*h/2-r*h*h*h/6,o=Math.asin(this.sin_p12*Math.cos(h)+this.cos_p12*Math.sin(h)*o),e=q(this.long0+Math.asin(Math.sin(n)*Math.sin(h)/Math.cos(o))),h=Math.sin(o),s=Math.atan2((h-this.es*r*this.sin_p12)*Math.tan(o),h*(1-this.es))),t.x=e,t.y=s,t)},names:["Azimuthal_Equidistant","aeqd"]};var Bi={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(t){var i,e,s=t.x,n=t.y,o=q(s-this.long0),a=Math.sin(n),r=Math.cos(n),s=Math.cos(o);return(0<(n=this.sin_p14*a+this.cos_p14*r*s)||Math.abs(n)<=x)&&(i=+this.a*r*Math.sin(o),e=this.y0+ +this.a*(this.cos_p14*a-this.sin_p14*r*s)),t.x=i,t.y=e,t},inverse:function(t){var i,e,s,n,o,a;return t.x-=this.x0,t.y-=this.y0,i=Math.sqrt(t.x*t.x+t.y*t.y),n=wi(i/this.a),e=Math.sin(n),s=Math.cos(n),o=this.long0,Math.abs(i)<=x?(a=this.lat0,t.x=o,t.y=a,t):(a=wi(s*this.sin_p14+t.y*e*this.cos_p14/i),n=Math.abs(this.lat0)-g,o=Math.abs(n)<=x?0<=this.lat0?q(this.long0+Math.atan2(t.x,-t.y)):q(this.long0-Math.atan2(-t.x,t.y)):q(this.long0+Math.atan2(t.x*e,i*this.cos_p14*s-t.y*this.sin_p14*e)),t.x=o,t.y=a,t)},names:["ortho"]},Ni=1,Ri=2,ji=3,Di=4,qi=5,Gi=6,Fi={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4};function Hi(t,i,e,s){var n;return t=g-w/2?this.face=qi:this.lat0<=-(g-w/2)?this.face=Gi:Math.abs(this.long0)<=w?this.face=Ni:Math.abs(this.long0)<=g+w?this.face=0=Math.abs(t.y)?l.value=Fi.AREA_0:0<=t.y&&t.y>=Math.abs(t.x)?(l.value=Fi.AREA_1,i-=g):t.x<0&&-t.x>=Math.abs(t.y)?(l.value=Fi.AREA_2,i=i<0?i+c:i-c):(l.value=Fi.AREA_3,i+=g),n=c/12*Math.tan(i),o=Math.sin(n)/(Math.cos(n)-1/Math.sqrt(2)),o=Math.atan(o),(e=1-(i=Math.cos(i))*i*(e=Math.tan(e))*e*(1-Math.cos(Math.atan(1/Math.cos(o)))))<-1?e=-1:1i.y)--e;else{if(!(Xi[e+1][0]<=i.y))break;++e}var s=Xi[e],n=function(t,i,e,s){for(var n=i;s;--s){var o=t(n);if(n-=o,Math.abs(o){(t=t.split(" ")).forEach(function(t){r.DomUtil[i].call(this,e,t)})},i=(t,i)=>e("addClass",t,i),s=(t,i)=>e("removeClass",t,i),t=r.Marker.extend({initialize(t,i){r.Util.setOptions(this,i),this._latlng=t,this.createIcon()},createIcon(){var t=this.options;let i="";void 0!==t.color&&(i+=`stroke:${t.color};`),void 0!==t.weight&&(i+=`stroke-width:${t.weight};`),void 0!==t.fillColor&&(i+=`fill:${t.fillColor};`),void 0!==t.fillOpacity&&(i+=`fill-opacity:${t.fillOpacity};`),void 0!==t.opacity&&(i+=`opacity:${t.opacity};`);t=this._getIconSVG(t,i);this._locationIcon=r.divIcon({className:t.className,html:t.svg,iconSize:[t.w,t.h]}),this.setIcon(this._locationIcon)},_getIconSVG(t,i){var e=t.radius,s=e+t.weight,t=2*s;return{className:"leaflet-control-locate-location",svg:``+'',w:t,h:t}},setStyle(t){r.Util.setOptions(this,t),this.createIcon()}});var n=t.extend({initialize(t,i,e){r.Util.setOptions(this,e),this._latlng=t,this._heading=i,this.createIcon()},setHeading(t){this._heading=t},_getIconSVG(t,i){var e=t.radius,s=t.width+t.weight,e=2*(e+t.depth+t.weight),t=`M0,0 l${t.width/2},${t.depth} l-${s},0 z`;return{className:"leaflet-control-locate-heading",svg:``+'',w:s,h:e}}}),n=r.Control.extend({options:{position:"topleft",layer:void 0,setView:"untilPanOrZoom",keepCurrentZoomLevel:!1,initialZoomLevel:!1,getLocationBounds(t){return t.bounds},flyTo:!1,clickBehavior:{inView:"stop",outOfView:"setView",inViewNotFollowing:"inView"},returnToPrevBounds:!1,cacheLocation:!0,drawCircle:!0,drawMarker:!0,showCompass:!0,markerClass:t,compassClass:n,circleStyle:{className:"leaflet-control-locate-circle",color:"#136AEC",fillColor:"#136AEC",fillOpacity:.15,weight:0},markerStyle:{className:"leaflet-control-locate-marker",color:"#fff",fillColor:"#2A93EE",fillOpacity:1,weight:3,opacity:1,radius:9},compassStyle:{fillColor:"#2A93EE",fillOpacity:1,weight:0,color:"#fff",opacity:1,radius:9,width:9,depth:6},followCircleStyle:{},followMarkerStyle:{},followCompassStyle:{},icon:"leaflet-control-locate-location-arrow",iconLoading:"leaflet-control-locate-spinner",iconElementTag:"span",textElementTag:"small",circlePadding:[0,0],metric:!0,createButtonCallback(t,i){const e=r.DomUtil.create("a","leaflet-bar-part leaflet-bar-part-single",t);e.title=i.strings.title,e.href="#",e.setAttribute("role","button");const s=r.DomUtil.create(i.iconElementTag,i.icon,e);if(void 0!==i.strings.text){const n=r.DomUtil.create(i.textElementTag,"leaflet-locate-text",e);n.textContent=i.strings.text,e.classList.add("leaflet-locate-text-active"),e.parentNode.style.display="flex",0new r.Control.Locate(t),n},window); +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var i,e,s=1,n=arguments.length;s=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=B(t);var i=this.min,e=this.max,s=t.min,n=t.max,t=n.x>=i.x&&s.x<=e.x,e=n.y>=i.y&&s.y<=e.y;return t&&e},overlaps:function(t){t=B(t);var i=this.min,e=this.max,s=t.min,n=t.max,t=n.x>i.x&&s.xi.y&&s.y=s.lat&&e.lat<=n.lat&&i.lng>=s.lng&&e.lng<=n.lng},intersects:function(t){t=R(t);var i=this._southWest,e=this._northEast,s=t.getSouthWest(),n=t.getNorthEast(),t=n.lat>=i.lat&&s.lat<=e.lat,e=n.lng>=i.lng&&s.lng<=e.lng;return t&&e},overlaps:function(t){t=R(t);var i=this._southWest,e=this._northEast,s=t.getSouthWest(),n=t.getNorthEast(),t=n.lat>i.lat&&s.lati.lng&&s.lng","http://www.w3.org/2000/svg"===(Tt.firstChild&&Tt.firstChild.namespaceURI));function St(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var Et={ie:Y,ielt9:$,edge:tt,webkit:it,android:et,android23:st,androidStock:ot,opera:at,chrome:rt,gecko:ht,safari:lt,phantom:ct,opera12:ut,win:dt,ie3d:_t,webkit3d:pt,gecko3d:mt,any3d:ft,mobile:gt,mobileWebkit:vt,mobileWebkit3d:yt,msPointer:Mt,pointer:xt,touch:bt,touchNative:wt,mobileOpera:Pt,mobileGecko:F,retina:Lt,passiveEvents:Ct,canvas:nt,svg:Q,vml:!Q&&function(){try{var t=document.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}(),inlineSvg:Tt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},kt=Et.msPointer?"MSPointerDown":"pointerdown",zt=Et.msPointer?"MSPointerMove":"pointermove",At=Et.msPointer?"MSPointerUp":"pointerup",Ot=Et.msPointer?"MSPointerCancel":"pointercancel",It={touchstart:kt,touchmove:zt,touchend:At,touchcancel:Ot},Zt={touchstart:function(t,i){i.MSPOINTER_TYPE_TOUCH&&i.pointerType===i.MSPOINTER_TYPE_TOUCH&&Oi(i);Gt(t,i)},touchmove:Gt,touchend:Gt,touchcancel:Gt},Bt={},Nt=!1;function Rt(t,i,e){return"touchstart"===i&&(Nt||(document.addEventListener(kt,jt,!0),document.addEventListener(zt,Dt,!0),document.addEventListener(At,qt,!0),document.addEventListener(Ot,qt,!0),Nt=!0)),Zt[i]?(e=Zt[i].bind(this,e),t.addEventListener(It[i],e,!1),e):(console.warn("wrong event specified:",i),c)}function jt(t){Bt[t.pointerId]=t}function Dt(t){Bt[t.pointerId]&&(Bt[t.pointerId]=t)}function qt(t){delete Bt[t.pointerId]}function Gt(t,i){if(i.pointerType!==(i.MSPOINTER_TYPE_MOUSE||"mouse")){for(var e in i.touches=[],Bt)i.touches.push(Bt[e]);i.changedTouches=[i],t(i)}}var Ft=200;function Ht(t,e){t.addEventListener("dblclick",e);var s,n=0;function i(t){var i;1===t.detail?"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((i=Zi(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!i.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((i=Date.now())-n<=Ft?2===++s&&e(function(t){var i,e,s={};for(e in t)i=t[e],s[e]=i&&i.bind?i.bind(t):i;return(t=s).type="dblclick",s.detail=2,s.isTrusted=!1,s._simulated=!0,s}(t)):s=1,n=i)):s=t.detail}return t.addEventListener("click",i),{dblclick:e,simDblclick:i}}var Ut,Wt,Vt,Kt,Xt,Jt,Qt=_i(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),Yt=_i(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),$t="webkitTransition"===Yt||"OTransition"===Yt?Yt+"End":"transitionend";function ti(t){return"string"==typeof t?document.getElementById(t):t}function ii(t,i){var e=t.style[i]||t.currentStyle&&t.currentStyle[i];return"auto"===(e=(!e||"auto"===e)&&document.defaultView?(t=document.defaultView.getComputedStyle(t,null))?t[i]:null:e)?null:e}function ei(t,i,e){t=document.createElement(t);return t.className=i||"",e&&e.appendChild(t),t}function si(t){var i=t.parentNode;i&&i.removeChild(t)}function ni(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function oi(t){var i=t.parentNode;i&&i.lastChild!==t&&i.appendChild(t)}function ai(t){var i=t.parentNode;i&&i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function ri(t,i){if(void 0!==t.classList)return t.classList.contains(i);t=ui(t);return 0this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),t=this._limitCenter(e,this._zoom,R(t));return e.equals(t)||this.panTo(t,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e=I((i=i||{}).paddingTopLeft||i.padding||[0,0]),s=I(i.paddingBottomRight||i.padding||[0,0]),n=this.project(this.getCenter()),o=this.project(t),t=this.getPixelBounds(),e=B([t.min.add(e),t.max.subtract(s)]),t=e.getSize();return e.contains(o)||(this._enforcingBounds=!0,s=o.subtract(e.getCenter()),t=e.extend(o).getSize().subtract(t),n.x+=s.x<0?-t.x:t.x,n.y+=s.y<0?-t.y:t.y,this.panTo(this.unproject(n),i),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var i=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var e=this.getSize(),s=i.divideBy(2).round(),n=e.divideBy(2).round(),n=s.subtract(n);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(r(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:i,newSize:e})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=l({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var i=r(this._handleGeolocationResponse,this),e=r(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(i,e,t):navigator.geolocation.getCurrentPosition(i,e,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i;this._container._leaflet_id&&(i=t.code,t=t.message||(1===i?"permission denied":2===i?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:i,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var i,e=new j(t.coords.latitude,t.coords.longitude),s=e.toBounds(2*t.coords.accuracy),n=this._locateOptions;n.setView&&(i=this.getBoundsZoom(s),this.setView(e,n.maxZoom?Math.min(i,n.maxZoom):i));var o,a={latlng:e,bounds:s,timestamp:t.timestamp};for(o in t.coords)"number"==typeof t.coords[o]&&(a[o]=t.coords[o]);this.fire("locationfound",a)}},addHandler:function(t,i){if(!i)return this;i=this[t]=new i(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),si(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(T(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)si(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){i=ei("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),i||this._mapPane);return t&&(this._panes[t]=i),i},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new N(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=R(t),e=I(e||[0,0]);var s=this.getZoom()||0,n=this.getMinZoom(),o=this.getMaxZoom(),a=t.getNorthWest(),r=t.getSouthEast(),t=this.getSize().subtract(e),e=B(this.project(r,s),this.project(a,s)).getSize(),r=Et.any3d?this.options.zoomSnap:1,a=t.x/e.x,e=t.y/e.y,e=i?Math.max(a,e):Math.min(a,e),s=this.getScaleZoom(e,s);return r&&(s=Math.round(s/(r/100))*(r/100),s=i?Math.ceil(s/r)*r:Math.floor(s/r)*r),Math.max(n,Math.min(o,s))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new A(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){i=this._getTopLeftPoint(t,i);return new Z(i,i.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;i=e.zoom(t*e.scale(i));return isNaN(i)?1/0:i},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(D(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(I(t),i)},layerPointToLatLng:function(t){t=I(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(D(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(D(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(R(t))},distance:function(t,i){return this.options.crs.distance(D(t),D(i))},containerPointToLayerPoint:function(t){return I(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return I(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(I(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(D(t)))},mouseEventToContainerPoint:function(t){return Bi(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=ti(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");bi(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&Et.any3d,hi(t,"leaflet-container"+(Et.touch?" leaflet-touch":"")+(Et.retina?" leaflet-retina":"")+(Et.ielt9?" leaflet-oldie":"")+(Et.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var i=ii(t,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&"sticky"!==i&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),mi(this._mapPane,new A(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(hi(t.markerPane,"leaflet-zoom-hide"),hi(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,i,e){mi(this._mapPane,new A(0,0));var s=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire("viewprereset");var n=this._zoom!==i;this._moveStart(n,e)._move(t,i)._moveEnd(n),this.fire("viewreset"),s&&this.fire("load")},_moveStart:function(t,i){return t&&this.fire("zoomstart"),i||this.fire("movestart"),this},_move:function(t,i,e,s){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),s?e&&e.pinch&&this.fire("zoom",e):((n||e&&e.pinch)&&this.fire("zoom",e),this.fire("move",e)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return T(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){mi(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var i=t?Li:bi;i((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&i(window,"resize",this._onResize,this),Et.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){T(this._resizeRequest),this._resizeRequest=C(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,s=[],n="mouseout"===i||"mouseover"===i,o=t.target||t.srcElement,a=!1;o;){if((e=this._targets[h(o)])&&("click"===i||"preclick"===i)&&this._draggableMoved(e)){a=!0;break}if(e&&e.listens(i,!0)){if(n&&!ji(o,t))break;if(s.push(e),n)break}if(o===this._container)break;o=o.parentNode}return s=!(s.length||a||n)&&this.listens(i,!0)?[this]:s},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var i,e=t.target||t.srcElement;!this._loaded||e._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(e)||("mousedown"===(i=t.type)&&yi(e),this._fireDOMEvent(t,i))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,e));var s=this._findEventTargets(t,i);if(e){for(var n=[],o=0;othis.options.zoomAnimationThreshold)return!1;var s=this.getZoomScale(i),s=this._getCenterOffset(t)._divideBy(1-1/s);return!(!0!==e.animate&&!this.getSize().contains(s))&&(C(function(){this._moveStart(!0,e.noMoveStart||!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,s){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,hi(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:s}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(r(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&li(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Gi(t){return new Fi(t)}var Fi=E.extend({options:{position:"topright"},initialize:function(t){_(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),t=t._controlCorners[e];return hi(i,"leaflet-control"),-1!==e.indexOf("bottom")?t.insertBefore(i,t.firstChild):t.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(si(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",i=document.createElement("div");return i.innerHTML=t,i.firstChild},_addItem:function(t){var i,e=document.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers_"+h(this),s),this._layerControlInputs.push(i),i.layerId=h(t.layer),bi(i,"click",this._onInputClick,this);var n=document.createElement("span");n.innerHTML=" "+t.name;s=document.createElement("span");return e.appendChild(s),s.appendChild(i),s.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){if(!this._preventClick){var t,i,e=this._layerControlInputs,s=[],n=[];this._handlingClick=!0;for(var o=e.length-1;0<=o;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.checked?s.push(i):t.checked||n.push(i);for(o=0;oi.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section;this._preventClick=!0,bi(t,"click",Oi),this.expand();var i=this;setTimeout(function(){Li(t,"click",Oi),i._preventClick=!1})}}),Ui=Fi.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=ei("div",i+" leaflet-bar"),s=this.options;return this._zoomInButton=this._createButton(s.zoomInText,s.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(s.zoomOutText,s.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,s,n){s=ei("a",e,s);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Ai(s),bi(s,"click",Ii),bi(s,"click",n,this),bi(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";li(this._zoomInButton,i),li(this._zoomOutButton,i),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(hi(this._zoomOutButton,i),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(hi(this._zoomInButton,i),this._zoomInButton.setAttribute("aria-disabled","true"))}});qi.mergeOptions({zoomControl:!0}),qi.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new Ui,this.addControl(this.zoomControl))});var Wi=Fi.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=ei("div",i),s=this.options;return this._addScales(s,i+"-line",e),t.on(s.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ei("div",i,e)),t.imperial&&(this._iScale=ei("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,i=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(i)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t);this._updateScale(this._mScale,i<1e3?i+" m":i/1e3+" km",i/t)},_updateImperial:function(t){var i,e=3.2808399*t;5280'+(Et.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){_(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=ei("div","leaflet-control-attribution"),Ai(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},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},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,i=[];for(t in this._attributions)this._attributions[t]&&i.push(t);var e=[];this.options.prefix&&e.push(this.options.prefix),i.length&&e.push(i.join(", ")),this._container.innerHTML=e.join(' ')}}});qi.mergeOptions({attributionControl:!0}),qi.addInitHook(function(){this.options.attributionControl&&(new Vi).addTo(this)});Fi.Layers=Hi,Fi.Zoom=Ui,Fi.Scale=Wi,Fi.Attribution=Vi,Gi.layers=function(t,i,e){return new Hi(t,i,e)},Gi.zoom=function(t){return new Ui(t)},Gi.scale=function(t){return new Wi(t)},Gi.attribution=function(t){return new Vi(t)};xt=E.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}});xt.addTo=function(t,i){return t.addHandler(i,this),this};var bt={Events:k},Ki=Et.touch?"touchstart mousedown":"mousedown",Xi=z.extend({options:{clickTolerance:3},initialize:function(t,i,e,s){_(this,s),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(bi(this._dragStartTarget,Ki,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Xi._dragging===this&&this.finishDrag(!0),Li(this._dragStartTarget,Ki,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var i,e;this._enabled&&(this._moved=!1,ri(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Xi._dragging===this&&this.finishDrag():Xi._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Xi._dragging=this)._preventOutline&&yi(this._element),gi(),Vt(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=xi(this._element),this._startPoint=new A(i.clientX,i.clientY),this._startPos=fi(this._element),this._parentScale=wi(e),t="mousedown"===t.type,bi(document,t?"mousemove":"touchmove",this._onMove,this),bi(document,t?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var i;this._enabled&&(t.touches&&1i&&(e.push(t[s]),n=s);ni.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function oe(t,i,e,s){var n=i.x,o=i.y,a=e.x-n,r=e.y-o,i=a*a+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=s.y>t.y&&t.x<(s.x-e.x)*(t.y-e.y)/(s.y-e.y)+e.x&&(l=!l);return l||ye.prototype._containsPoint.call(this,t,!0)}});var xe=ue.extend({initialize:function(t,i){_(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,s,n=g(t)?t:t.features;if(n){for(i=0,e=n.length;io.x&&(a=e.x+r-o.x+n.x),e.x-a-s.x<(r=0)&&(a=e.x-s.x),e.y+i+n.y>o.y&&(r=e.y+i-o.y+n.y),e.y-r-s.y<0&&(r=e.y-s.y),(a||r)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([a,r]))))},_getAnchor:function(){return I(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});qi.mergeOptions({closePopupOnClick:!0}),qi.include({openPopup:function(t,i,e){return this._initOverlay(Ze,t,i,e).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),k.include({bindPopup:function(t,i){return this._popup=this._initOverlay(Ze,this._popup,t,i),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ue||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i;this._popup&&this._map&&(Ii(t),i=t.layer||t.target,this._popup._source!==i||i instanceof fe?(this._popup._source=i,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var Be=Ie.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Ie.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Ie.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Ie.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=ei("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i,e=this._map,s=this._container,n=e.latLngToContainerPoint(e.getCenter()),o=e.layerPointToContainerPoint(t),a=this.options.direction,r=s.offsetWidth,h=s.offsetHeight,l=I(this.options.offset),e=this._getAnchor(),h="top"===a?(i=r/2,h):"bottom"===a?(i=r/2,0):(i="center"===a?r/2:"right"===a?0:"left"===a?r:o.xthis.options.maxZoom||sthis.options.maxZoom||void 0!==this.options.minZoom&&ne.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;t=this._tileCoordsToBounds(t);return R(this.options.bounds).overlaps(t)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),s=t.scaleBy(e),e=s.add(e);return[i.unproject(s,t.z),i.unproject(e,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new N(t[0],t[1]);return t=!this.options.noWrap?this._map.wrapLatLngBounds(t):t},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),t=new A(+i[0],+i[1]);return t.z=+i[2],t},_removeTile:function(t){var i=this._tiles[t];i&&(si(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){hi(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=c,t.onmousemove=c,Et.ielt9&&this.options.opacity<1&&di(t,this.options.opacity)},_addTile:function(t,i){var e=this._getTilePos(t),s=this._tileCoordsToKey(t),n=this.createTile(this._wrapCoords(t),r(this._tileReady,this,t));this._initTile(n),this.createTile.length<2&&C(r(this._tileReady,this,t,null,n)),mi(n,e),this._tiles[s]={el:n,coords:t,current:!0},i.appendChild(n),this.fire("tileloadstart",{tile:n,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var s=this._tileCoordsToKey(t);(e=this._tiles[s])&&(e.loaded=+new Date,this._map._fadeAnimated?(di(e.el,0),T(this._fadeFrame),this._fadeFrame=C(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(hi(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),Et.ielt9||!this._map._fadeAnimated?C(this._pruneTiles,this):setTimeout(r(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new A(this._wrapX?n(t.x,this._wrapX):t.x,this._wrapY?n(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new Z(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var je=Re.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,i){this._url=t,(i=_(this,i)).detectRetina&&Et.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),nt={_initContainer:function(){this._container=ei("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Ge.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=Ue("shape");hi(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=Ue("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;si(i),t.removeInteractiveTarget(i),delete this._layers[h(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,s=t.options,n=t._container;n.stroked=!!s.stroke,n.filled=!!s.fill,s.stroke?(i=i||(t._stroke=Ue("stroke")),n.appendChild(i),i.weight=s.weight+"px",i.color=s.color,i.opacity=s.opacity,s.dashArray?i.dashStyle=g(s.dashArray)?s.dashArray.join(" "):s.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=s.lineCap.replace("butt","flat"),i.joinstyle=s.lineJoin):i&&(n.removeChild(i),t._stroke=null),s.fill?(e=e||(t._fill=Ue("fill")),n.appendChild(e),e.color=s.fillColor||s.color,e.opacity=s.fillOpacity):e&&(n.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),s=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+s+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){oi(t._container)},_bringToBack:function(t){ai(t._container)}},We=Et.vml?Ue:X,Ve=Ge.extend({_initContainer:function(){this._container=We("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=We("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){si(this._container),Li(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,i,e;this._map._animatingZoom&&this._bounds||(Ge.prototype._update.call(this),i=(t=this._bounds).getSize(),e=this._container,this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),mi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update"))},_initPath:function(t){var i=t._path=We("path");t.options.className&&hi(i,t.options.className),t.options.interactive&&hi(i,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){si(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,t=t.options;i&&(t.stroke?(i.setAttribute("stroke",t.color),i.setAttribute("stroke-opacity",t.opacity),i.setAttribute("stroke-width",t.weight),i.setAttribute("stroke-linecap",t.lineCap),i.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?i.setAttribute("stroke-dasharray",t.dashArray):i.removeAttribute("stroke-dasharray"),t.dashOffset?i.setAttribute("stroke-dashoffset",t.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),t.fill?(i.setAttribute("fill",t.fillColor||t.color),i.setAttribute("fill-opacity",t.fillOpacity),i.setAttribute("fill-rule",t.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,J(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),s="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+s+2*e+",0 "+s+2*-e+",0 ";this._setPath(t,e)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){oi(t._path)},_bringToBack:function(t){ai(t._path)}});function Ke(t){return Et.svg||Et.vml?new Ve(t):null}Et.vml&&Ve.include(nt),qi.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&He(t)||Ke(t)}});var Xe=Me.extend({initialize:function(t,i){Me.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=R(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Ve.create=We,Ve.pointsToPath=J,xe.geometryToLayer=we,xe.coordsToLatLng=Pe,xe.coordsToLatLngs=Le,xe.latLngToCoords=Ce,xe.latLngsToCoords=Te,xe.getFeature=Se,xe.asFeature=Ee,qi.mergeOptions({boxZoom:!0});F=xt.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){bi(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Li(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){si(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Vt(),gi(),this._startPoint=this._map.mouseEventToContainerPoint(t),bi(document,{contextmenu:Ii,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ei("div","leaflet-zoom-box",this._container),hi(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new Z(this._point,this._startPoint),t=i.getSize();mi(this._box,i.min),this._box.style.width=t.x+"px",this._box.style.height=t.y+"px"},_finish:function(){this._moved&&(si(this._box),li(this._container,"leaflet-crosshair")),Kt(),vi(),Li(document,{contextmenu:Ii,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(r(this._resetState,this),0),t=new N(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}});qi.addInitHook("addHandler","boxZoom",F),qi.mergeOptions({doubleClickZoom:!0});Q=xt.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),s=i.options.zoomDelta,s=t.originalEvent.shiftKey?e-s:e+s;"center"===i.options.doubleClickZoom?i.setZoom(s):i.setZoomAround(t.containerPoint,s)}});qi.addInitHook("addHandler","doubleClickZoom",Q),qi.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});V=xt.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Xi(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),hi(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){li(this._map._container,"leaflet-grab"),li(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,i=this._map;i._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=R(this._map.options.maxBounds),this._offsetLimit=B(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,i.fire("movestart").fire("dragstart"),i.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var i,e;this._map.options.inertia&&(i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(e),this._times.push(i),this._prunePositions(i)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,s=this._draggable._newPos.x,n=(s-i+e)%t+i-e,i=(s+i+e)%t-i-e,i=Math.abs(n+e)i.getMaxZoom()&&1=this.text.length)return;t=this.text[this.place++]}switch(this.state){case 1:return this.neutral(t);case 2:return this.keyword(t);case 4:return this.quoted(t);case 5:return this.afterquote(t);case 3:return this.number(t);case-1:return}},C.prototype.afterquote=function(t){if('"'===t)return this.word+='"',void(this.state=4);if(d.test(t))return this.word=this.word.trim(),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in afterquote yet, index '+this.place)},C.prototype.afterItem=function(t){if(","===t)return null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=1);"]"===t&&(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=1,this.currentObject=this.stack.pop(),this.currentObject||(this.state=-1))},C.prototype.number=function(t){if(!L.test(t)){if(d.test(t))return this.word=parseFloat(this.word),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in number yet, index '+this.place)}this.word+=t},C.prototype.quoted=function(t){'"'!==t?this.word+=t:this.state=5},C.prototype.keyword=function(t){if(u.test(t))this.word+=t;else{if("["===t){var i=[];return i.push(this.word),this.level++,null===this.root?this.root=i:this.currentObject.push(i),this.stack.push(this.currentObject),this.currentObject=i,void(this.state=1)}if(!d.test(t))throw new Error("havn't handled \""+t+'" in keyword yet, index '+this.place);this.afterItem(t)}},C.prototype.neutral=function(t){if(s.test(t))return this.word=t,void(this.state=2);if('"'===t)return this.word="",void(this.state=4);if(L.test(t))return this.word=t,void(this.state=3);if(!d.test(t))throw new Error("havn't handled \""+t+'" in neutral yet, index '+this.place);this.afterItem(t)},C.prototype.output=function(){for(;this.placeMath.PI&&(s-=2*Math.PI),t=Math.sin(n),n=Math.cos(n),{x:((e=e/Math.sqrt(1-i*(t*t)))+o)*n*Math.cos(s),y:(e+o)*n*Math.sin(s),z:(e*(1-i)+o)*t}}function Y(t,i,e,s){var n,o,a,r,h,l,c,u,d,_,p,m=1e-12,f=t.x,g=t.y,v=t.z||0,y=Math.sqrt(f*f+g*g),M=Math.sqrt(f*f+g*g+v*v);if(y/ex?Math.tan(e):0,c=Math.pow(i,2),u=Math.pow(c,2),d=1-this.es*Math.pow(n,2);a/=Math.sqrt(d);i=qt(e,n,o,this.en),d=this.a*(this.k0*a*(1+r/6*(1-c+h+r/20*(5-18*c+u+14*h-58*c*h+r/42*(61+179*u-u*c-479*c)))))+this.x0,u=this.a*(this.k0*(i-this.ml0+n*s*a/2*(1+r/12*(5-c+9*h+4*l+r/30*(61+u-58*c+270*h-330*c*h+r/56*(1385+543*u-u*c-3111*c))))))+this.y0}else{c=o*Math.sin(s);if(Math.abs(Math.abs(c)-1)x?Math.tan(i):0,s=this.ep2*Math.pow(e,2),l=Math.pow(s,2),n=Math.pow(r,2),o=Math.pow(n,2),h=1-this.es*Math.pow(a,2),a=c*Math.sqrt(h)/this.k0,l=i-(h*=r)*(r=Math.pow(a,2))/(1-this.es)*.5*(1-r/12*(5+3*n-9*s*n+s-4*l-r/30*(61+90*n-252*s*n+45*o+46*s-r/56*(1385+3633*n+4095*o+1574*o*n)))),q(this.long0+a*(1-r/6*(1+2*n+s-r/20*(5+28*n+24*o+8*s*n+6*s-r/42*(61+662*n+1320*o+720*o*n))))/e)):(l=g*D(u),0)):(c=.5*((d=Math.exp(c/this.k0))-1/d),d=this.lat0+u/this.k0,d=Math.cos(d),h=Math.sqrt((1-Math.pow(d,2))/(1+Math.pow(c,2))),l=Math.asin(h),u<0&&(l=-l),0==c&&0===d?0:q(Math.atan2(c,d)+this.long0));return t.x=d,t.y=l,t},names:["Transverse_Mercator","Transverse Mercator","tmerc"]},Wt=function(t){var t=Math.exp(t);return t=(t-1/t)/2},Vt=function(t,i){t=Math.abs(t),i=Math.abs(i);var e=Math.max(t,i),i=Math.min(t,i)/(e||1);return e*Math.sqrt(1+Math.pow(i,2))},Kt=function(t){var i=1+t,e=i-1;return 0==e?t:t*Math.log(i)/e},Xt=function(t){var t=Math.exp(t);return t=(t+1/t)/2};var Jt={init:function(){if(void 0===this.es||this.es<=0)throw new Error("incorrect elliptical usage");this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var t=(i=this.es/(1+Math.sqrt(1-this.es)))/(2-i),i=t;this.cgb[0]=t*(2+t*(-2/3+t*(t*(116/45+t*(26/45+-2854/675*t))-2))),this.cbg[0]=t*(t*(2/3+t*(4/3+t*(-82/45+t*(32/45+4642/4725*t))))-2),this.cgb[1]=(i*=t)*(7/3+t*(t*(-227/45+t*(2704/315+2323/945*t))-1.6)),this.cbg[1]=i*(5/3+t*(-16/15+t*(-13/9+t*(904/315+-1522/945*t)))),this.cgb[2]=(i*=t)*(56/15+t*(-136/35+t*(-1262/105+73814/2835*t))),this.cbg[2]=i*(-26/15+t*(34/21+t*(1.6+-12686/2835*t))),this.cgb[3]=(i*=t)*(4279/630+t*(-332/35+-399572/14175*t)),this.cbg[3]=i*(1237/630+t*(-24832/14175*t-2.4)),this.cgb[4]=(i*=t)*(4174/315+-144838/6237*t),this.cbg[4]=i*(-734/315+109598/31185*t),this.cgb[5]=601676/22275*(i*=t),this.cbg[5]=444337/155925*i,i=Math.pow(t,2),this.Qn=this.k0/(1+t)*(1+i*(.25+i*(1/64+i/256))),this.utg[0]=t*(t*(2/3+t*(-37/96+t*(1/360+t*(81/512+-96199/604800*t))))-.5),this.gtu[0]=t*(.5+t*(-2/3+t*(5/16+t*(41/180+t*(-127/288+7891/37800*t))))),this.utg[1]=i*(-1/48+t*(-1/15+t*(437/1440+t*(-46/105+1118711/3870720*t)))),this.gtu[1]=i*(13/48+t*(t*(557/1440+t*(281/630+-1983433/1935360*t))-.6)),this.utg[2]=(i*=t)*(-17/480+t*(37/840+t*(209/4480+-5569/90720*t))),this.gtu[2]=i*(61/240+t*(-103/140+t*(15061/26880+167603/181440*t))),this.utg[3]=(i*=t)*(-4397/161280+t*(11/504+830251/7257600*t)),this.gtu[3]=i*(49561/161280+t*(-179/168+6601661/7257600*t)),this.utg[4]=(i*=t)*(-4583/161280+108847/3991680*t),this.gtu[4]=i*(34729/80640+-3418889/1995840*t),this.utg[5]=-.03233083094085698*(i*=t),this.gtu[5]=.6650675310896665*i,i=Ft(this.cbg,this.lat0),this.Zb=-this.Qn*(i+function(t,i){for(var e,s=2*Math.cos(i),n=t.length-1,o=t[n],a=0;0<=--n;)e=s*o-a+t[n],a=o,o=e;return Math.sin(i)*e}(this.gtu,2*i))},forward:function(t){var i=q(t.x-this.long0),e=t.y,e=Ft(this.cbg,e),s=Math.sin(e),n=Math.cos(e),o=Math.sin(i),a=Math.cos(i);e=Math.atan2(s,a*n),i=Math.atan2(o*n,Vt(s,n*a)),n=Math.tan(i),a=Math.abs(n),a=Kt(a*(1+a/(Vt(1,a)+1)));var r,a=Ht(this.gtu,2*e,2*(i=n<0?-a:a));return e+=a[0],i+=a[1],e=Math.abs(i)<=2.623395162778?(r=this.a*(this.Qn*i)+this.x0,this.a*(this.Qn*e+this.Zb)+this.y0):r=1/0,t.x=r,t.y=e,t},inverse:function(t){var i,e,s,n,o=(t.x-this.x0)*(1/this.a),a=(t.y-this.y0)*(1/this.a);return a=(a-this.Zb)/this.Qn,o/=this.Qn,a=Math.abs(o)<=2.623395162778?(a+=(n=Ht(this.utg,2*a,2*o))[0],o+=n[1],o=Math.atan(Wt(o)),i=Math.sin(a),e=Math.cos(a),s=Math.sin(o),n=Math.cos(o),a=Math.atan2(i*n,Vt(s,n*e)),o=Math.atan2(s,n*e),e=q(o+this.long0),Ft(this.cgb,a)):e=1/0,t.x=e,t.y=a,t},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc"]};function Qt(t,i){return Math.pow((1-t)/(1+t),i)}var Yt={init:function(){var t=function(t,i){if(void 0===t){if((t=Math.floor(30*(q(i)+Math.PI)/Math.PI)+1)<0)return 0;if(60x?this.ns=Math.log(i/s)/Math.log(e/n):this.ns=t,isNaN(this.ns)&&(this.ns=t),this.f0=i/(this.ns*Math.pow(e,this.ns)),this.rh=this.a*this.f0*Math.pow(o,this.ns),this.title||(this.title="Lambert Conformal Conic"))},forward:function(t){var i=t.x,e=t.y;Math.abs(2*Math.abs(e)-Math.PI)<=x&&(e=D(e)*(g-2*x));var s,n=Math.abs(Math.abs(e)-g);if(xx?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(t){var i=t.x,e=t.y;this.sin_phi=Math.sin(e),this.cos_phi=Math.cos(e);var s=pi(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*s)/this.ns0,s=this.ns0*q(i-this.long0),i=e*Math.sin(s)+this.x0,s=this.rh-e*Math.cos(s)+this.y0;return t.x=i,t.y=s,t},inverse:function(t){var i,e,s,n;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,e=0<=this.ns0?(i=Math.sqrt(t.x*t.x+t.y*t.y),1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),-1),(s=0)!==i&&(s=Math.atan2(e*t.x,e*t.y)),e=i*this.ns0/this.a,n=this.sphere?Math.asin((this.c-e*e)/(2*this.ns0)):(n=(this.c-e*e)/this.ns0,this.phi1z(this.e3,n)),s=q(s/this.ns0+this.long0),t.x=s,t.y=n,t},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(t,i){var e,s,n,o=wi(.5*i);if(tMath.PI&&(e=Math.PI),s=(2*i+Math.sin(2*i))/Math.PI,12*g*this.a?void 0:(r=i/this.a,h=Math.sin(r),a=Math.cos(r),e=this.long0,Math.abs(i)<=x?s=this.lat0:(s=wi(a*this.sin_p12+t.y*h*this.cos_p12/i),o=Math.abs(this.lat0)-g,e=Math.abs(o)<=x?0<=this.lat0?q(this.long0+Math.atan2(t.x,-t.y)):q(this.long0-Math.atan2(-t.x,t.y)):q(this.long0+Math.atan2(t.x*h,i*this.cos_p12*a-t.y*this.sin_p12*h))),t.x=e,t.y=s,t):(r=ai(this.es),o=ri(this.es),a=hi(this.es),h=li(this.es),Math.abs(this.sin_p12-1)<=x?(n=this.a*oi(r,o,a,h,g),i=Math.sqrt(t.x*t.x+t.y*t.y),s=di((n-i)/this.a,r,o,a,h),e=q(this.long0+Math.atan2(t.x,-1*t.y))):Math.abs(this.sin_p12+1)<=x?(n=this.a*oi(r,o,a,h,g),i=Math.sqrt(t.x*t.x+t.y*t.y),s=di((i-n)/this.a,r,o,a,h),e=q(this.long0+Math.atan2(t.x,t.y))):(i=Math.sqrt(t.x*t.x+t.y*t.y),n=Math.atan2(t.x,t.y),r=ci(this.a,this.e,this.sin_p12),o=Math.cos(n),h=-(a=this.e*this.cos_p12*o)*a/(1-this.es),a=3*this.es*(1-h)*this.sin_p12*this.cos_p12*o/(1-this.es),r=1-h*(h=(r=i/r)-h*(1+h)*Math.pow(r,3)/6-a*(1+3*h)*Math.pow(r,4)/24)*h/2-r*h*h*h/6,o=Math.asin(this.sin_p12*Math.cos(h)+this.cos_p12*Math.sin(h)*o),e=q(this.long0+Math.asin(Math.sin(n)*Math.sin(h)/Math.cos(o))),h=Math.sin(o),s=Math.atan2((h-this.es*r*this.sin_p12)*Math.tan(o),h*(1-this.es))),t.x=e,t.y=s,t)},names:["Azimuthal_Equidistant","aeqd"]};var Bi={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(t){var i,e,s=t.x,n=t.y,o=q(s-this.long0),a=Math.sin(n),r=Math.cos(n),s=Math.cos(o);return(0<(n=this.sin_p14*a+this.cos_p14*r*s)||Math.abs(n)<=x)&&(i=+this.a*r*Math.sin(o),e=this.y0+ +this.a*(this.cos_p14*a-this.sin_p14*r*s)),t.x=i,t.y=e,t},inverse:function(t){var i,e,s,n,o,a;return t.x-=this.x0,t.y-=this.y0,i=Math.sqrt(t.x*t.x+t.y*t.y),n=wi(i/this.a),e=Math.sin(n),s=Math.cos(n),o=this.long0,Math.abs(i)<=x?(a=this.lat0,t.x=o,t.y=a,t):(a=wi(s*this.sin_p14+t.y*e*this.cos_p14/i),n=Math.abs(this.lat0)-g,o=Math.abs(n)<=x?0<=this.lat0?q(this.long0+Math.atan2(t.x,-t.y)):q(this.long0-Math.atan2(-t.x,t.y)):q(this.long0+Math.atan2(t.x*e,i*this.cos_p14*s-t.y*this.sin_p14*e)),t.x=o,t.y=a,t)},names:["ortho"]},Ni=1,Ri=2,ji=3,Di=4,qi=5,Gi=6,Fi={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4};function Hi(t,i,e,s){var n;return t=g-w/2?this.face=qi:this.lat0<=-(g-w/2)?this.face=Gi:Math.abs(this.long0)<=w?this.face=Ni:Math.abs(this.long0)<=g+w?this.face=0=Math.abs(t.y)?l.value=Fi.AREA_0:0<=t.y&&t.y>=Math.abs(t.x)?(l.value=Fi.AREA_1,i-=g):t.x<0&&-t.x>=Math.abs(t.y)?(l.value=Fi.AREA_2,i=i<0?i+c:i-c):(l.value=Fi.AREA_3,i+=g),n=c/12*Math.tan(i),o=Math.sin(n)/(Math.cos(n)-1/Math.sqrt(2)),o=Math.atan(o),(e=1-(i=Math.cos(i))*i*(e=Math.tan(e))*e*(1-Math.cos(Math.atan(1/Math.cos(o)))))<-1?e=-1:1i.y)--e;else{if(!(Xi[e+1][0]<=i.y))break;++e}var s=Xi[e],n=function(t,i,e,s){for(var n=i;s;--s){var o=t(n);if(n-=o,Math.abs(o){(t=t.split(" ")).forEach(function(t){r.DomUtil[i].call(this,e,t)})},i=(t,i)=>e("addClass",t,i),s=(t,i)=>e("removeClass",t,i),t=r.Marker.extend({initialize(t,i){r.Util.setOptions(this,i),this._latlng=t,this.createIcon()},createIcon(){var t=this.options;let i="";void 0!==t.color&&(i+=`stroke:${t.color};`),void 0!==t.weight&&(i+=`stroke-width:${t.weight};`),void 0!==t.fillColor&&(i+=`fill:${t.fillColor};`),void 0!==t.fillOpacity&&(i+=`fill-opacity:${t.fillOpacity};`),void 0!==t.opacity&&(i+=`opacity:${t.opacity};`);t=this._getIconSVG(t,i);this._locationIcon=r.divIcon({className:t.className,html:t.svg,iconSize:[t.w,t.h]}),this.setIcon(this._locationIcon)},_getIconSVG(t,i){var e=t.radius,s=e+t.weight,t=2*s;return{className:"leaflet-control-locate-location",svg:``+'',w:t,h:t}},setStyle(t){r.Util.setOptions(this,t),this.createIcon()}});var n=t.extend({initialize(t,i,e){r.Util.setOptions(this,e),this._latlng=t,this._heading=i,this.createIcon()},setHeading(t){this._heading=t},_getIconSVG(t,i){var e=t.radius,s=t.width+t.weight,e=2*(e+t.depth+t.weight),t=`M0,0 l${t.width/2},${t.depth} l-${s},0 z`;return{className:"leaflet-control-locate-heading",svg:``+'',w:s,h:e}}}),n=r.Control.extend({options:{position:"topleft",layer:void 0,setView:"untilPanOrZoom",keepCurrentZoomLevel:!1,initialZoomLevel:!1,getLocationBounds(t){return t.bounds},flyTo:!1,clickBehavior:{inView:"stop",outOfView:"setView",inViewNotFollowing:"inView"},returnToPrevBounds:!1,cacheLocation:!0,drawCircle:!0,drawMarker:!0,showCompass:!0,markerClass:t,compassClass:n,circleStyle:{className:"leaflet-control-locate-circle",color:"#136AEC",fillColor:"#136AEC",fillOpacity:.15,weight:0},markerStyle:{className:"leaflet-control-locate-marker",color:"#fff",fillColor:"#2A93EE",fillOpacity:1,weight:3,opacity:1,radius:9},compassStyle:{fillColor:"#2A93EE",fillOpacity:1,weight:0,color:"#fff",opacity:1,radius:9,width:9,depth:6},followCircleStyle:{},followMarkerStyle:{},followCompassStyle:{},icon:"leaflet-control-locate-location-arrow",iconLoading:"leaflet-control-locate-spinner",iconElementTag:"span",textElementTag:"small",circlePadding:[0,0],metric:!0,createButtonCallback(t,i){const e=r.DomUtil.create("a","leaflet-bar-part leaflet-bar-part-single",t);e.title=i.strings.title,e.href="#",e.setAttribute("role","button");const s=r.DomUtil.create(i.iconElementTag,i.icon,e);if(void 0!==i.strings.text){const n=r.DomUtil.create(i.textElementTag,"leaflet-locate-text",e);n.textContent=i.strings.text,e.classList.add("leaflet-locate-text-active"),e.parentNode.style.display="flex",0new r.Control.Locate(t),n},window); //# sourceMappingURL=leaflet.js.map \ No newline at end of file diff --git a/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js.map b/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js.map index 1b332a62e60..19378fcefc8 100644 --- a/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js.map +++ b/src/extension/mapml/src/main/resources/viewer/widget/leaflet.js.map @@ -1 +1 @@ -{"version":3,"file":"leaflet.js","sources":["leaflet-src.js","proj4-src.js","proj4leaflet.js","L.Control.Locate.js"],"sourcesContent":["/* @preserve\n * Leaflet 1.9.3, a JS library for interactive maps. https://leafletjs.com\n * (c) 2010-2022 Vladimir Agafonkin, (c) 2010-2011 CloudMade\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.leaflet = {}));\n})(this, (function (exports) { 'use strict';\n\n var version = \"1.9.3\";\n\n /*\r\n * @namespace Util\r\n *\r\n * Various utility functions, used by Leaflet internally.\r\n */\r\n\r\n // @function extend(dest: Object, src?: Object): Object\r\n // Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.\r\n function extend(dest) {\r\n \tvar i, j, len, src;\r\n\r\n \tfor (j = 1, len = arguments.length; j < len; j++) {\r\n \t\tsrc = arguments[j];\r\n \t\tfor (i in src) {\r\n \t\t\tdest[i] = src[i];\r\n \t\t}\r\n \t}\r\n \treturn dest;\r\n }\r\n\r\n // @function create(proto: Object, properties?: Object): Object\r\n // Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)\r\n var create$2 = Object.create || (function () {\r\n \tfunction F() {}\r\n \treturn function (proto) {\r\n \t\tF.prototype = proto;\r\n \t\treturn new F();\r\n \t};\r\n })();\r\n\r\n // @function bind(fn: Function, …): Function\r\n // Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\r\n // Has a `L.bind()` shortcut.\r\n function bind(fn, obj) {\r\n \tvar slice = Array.prototype.slice;\r\n\r\n \tif (fn.bind) {\r\n \t\treturn fn.bind.apply(fn, slice.call(arguments, 1));\r\n \t}\r\n\r\n \tvar args = slice.call(arguments, 2);\r\n\r\n \treturn function () {\r\n \t\treturn fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);\r\n \t};\r\n }\r\n\r\n // @property lastId: Number\r\n // Last unique ID used by [`stamp()`](#util-stamp)\r\n var lastId = 0;\r\n\r\n // @function stamp(obj: Object): Number\r\n // Returns the unique ID of an object, assigning it one if it doesn't have it.\r\n function stamp(obj) {\r\n \tif (!('_leaflet_id' in obj)) {\r\n \t\tobj['_leaflet_id'] = ++lastId;\r\n \t}\r\n \treturn obj._leaflet_id;\r\n }\r\n\r\n // @function throttle(fn: Function, time: Number, context: Object): Function\r\n // Returns a function which executes function `fn` with the given scope `context`\r\n // (so that the `this` keyword refers to `context` inside `fn`'s code). The function\r\n // `fn` will be called no more than one time per given amount of `time`. The arguments\r\n // received by the bound function will be any arguments passed when binding the\r\n // function, followed by any arguments passed when invoking the bound function.\r\n // Has an `L.throttle` shortcut.\r\n function throttle(fn, time, context) {\r\n \tvar lock, args, wrapperFn, later;\r\n\r\n \tlater = function () {\r\n \t\t// reset lock and call if queued\r\n \t\tlock = false;\r\n \t\tif (args) {\r\n \t\t\twrapperFn.apply(context, args);\r\n \t\t\targs = false;\r\n \t\t}\r\n \t};\r\n\r\n \twrapperFn = function () {\r\n \t\tif (lock) {\r\n \t\t\t// called too soon, queue to call later\r\n \t\t\targs = arguments;\r\n\r\n \t\t} else {\r\n \t\t\t// call and lock until later\r\n \t\t\tfn.apply(context, arguments);\r\n \t\t\tsetTimeout(later, time);\r\n \t\t\tlock = true;\r\n \t\t}\r\n \t};\r\n\r\n \treturn wrapperFn;\r\n }\r\n\r\n // @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number\r\n // Returns the number `num` modulo `range` in such a way so it lies within\r\n // `range[0]` and `range[1]`. The returned value will be always smaller than\r\n // `range[1]` unless `includeMax` is set to `true`.\r\n function wrapNum(x, range, includeMax) {\r\n \tvar max = range[1],\r\n \t min = range[0],\r\n \t d = max - min;\r\n \treturn x === max && includeMax ? x : ((x - min) % d + d) % d + min;\r\n }\r\n\r\n // @function falseFn(): Function\r\n // Returns a function which always returns `false`.\r\n function falseFn() { return false; }\r\n\r\n // @function formatNum(num: Number, precision?: Number|false): Number\r\n // Returns the number `num` rounded with specified `precision`.\r\n // The default `precision` value is 6 decimal places.\r\n // `false` can be passed to skip any processing (can be useful to avoid round-off errors).\r\n function formatNum(num, precision) {\r\n \tif (precision === false) { return num; }\r\n \tvar pow = Math.pow(10, precision === undefined ? 6 : precision);\r\n \treturn Math.round(num * pow) / pow;\r\n }\r\n\r\n // @function trim(str: String): String\r\n // Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)\r\n function trim(str) {\r\n \treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n }\r\n\r\n // @function splitWords(str: String): String[]\r\n // Trims and splits the string on whitespace and returns the array of parts.\r\n function splitWords(str) {\r\n \treturn trim(str).split(/\\s+/);\r\n }\r\n\r\n // @function setOptions(obj: Object, options: Object): Object\r\n // Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.\r\n function setOptions(obj, options) {\r\n \tif (!Object.prototype.hasOwnProperty.call(obj, 'options')) {\r\n \t\tobj.options = obj.options ? create$2(obj.options) : {};\r\n \t}\r\n \tfor (var i in options) {\r\n \t\tobj.options[i] = options[i];\r\n \t}\r\n \treturn obj.options;\r\n }\r\n\r\n // @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String\r\n // Converts an object into a parameter URL string, e.g. `{a: \"foo\", b: \"bar\"}`\r\n // translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will\r\n // be appended at the end. If `uppercase` is `true`, the parameter names will\r\n // be uppercased (e.g. `'?A=foo&B=bar'`)\r\n function getParamString(obj, existingUrl, uppercase) {\r\n \tvar params = [];\r\n \tfor (var i in obj) {\r\n \t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n \t}\r\n \treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n }\r\n\r\n var templateRe = /\\{ *([\\w_ -]+) *\\}/g;\r\n\r\n // @function template(str: String, data: Object): String\r\n // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`\r\n // and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string\r\n // `('Hello foo, bar')`. You can also specify functions instead of strings for\r\n // data values — they will be evaluated passing `data` as an argument.\r\n function template(str, data) {\r\n \treturn str.replace(templateRe, function (str, key) {\r\n \t\tvar value = data[key];\r\n\r\n \t\tif (value === undefined) {\r\n \t\t\tthrow new Error('No value provided for variable ' + str);\r\n\r\n \t\t} else if (typeof value === 'function') {\r\n \t\t\tvalue = value(data);\r\n \t\t}\r\n \t\treturn value;\r\n \t});\r\n }\r\n\r\n // @function isArray(obj): Boolean\r\n // Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)\r\n var isArray = Array.isArray || function (obj) {\r\n \treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n };\r\n\r\n // @function indexOf(array: Array, el: Object): Number\r\n // Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\r\n function indexOf(array, el) {\r\n \tfor (var i = 0; i < array.length; i++) {\r\n \t\tif (array[i] === el) { return i; }\r\n \t}\r\n \treturn -1;\r\n }\r\n\r\n // @property emptyImageUrl: String\r\n // Data URI string containing a base64-encoded empty GIF image.\r\n // Used as a hack to free memory from unused images on WebKit-powered\r\n // mobile devices (by setting image `src` to this string).\r\n var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\r\n\r\n // inspired by https://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n function getPrefixed(name) {\r\n \treturn window['webkit' + name] || window['moz' + name] || window['ms' + name];\r\n }\r\n\r\n var lastTime = 0;\r\n\r\n // fallback for IE 7-8\r\n function timeoutDefer(fn) {\r\n \tvar time = +new Date(),\r\n \t timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n \tlastTime = time + timeToCall;\r\n \treturn window.setTimeout(fn, timeToCall);\r\n }\r\n\r\n var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\n var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||\r\n \t\tgetPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };\r\n\r\n // @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number\r\n // Schedules `fn` to be executed when the browser repaints. `fn` is bound to\r\n // `context` if given. When `immediate` is set, `fn` is called immediately if\r\n // the browser doesn't have native support for\r\n // [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),\r\n // otherwise it's delayed. Returns a request ID that can be used to cancel the request.\r\n function requestAnimFrame(fn, context, immediate) {\r\n \tif (immediate && requestFn === timeoutDefer) {\r\n \t\tfn.call(context);\r\n \t} else {\r\n \t\treturn requestFn.call(window, bind(fn, context));\r\n \t}\r\n }\r\n\r\n // @function cancelAnimFrame(id: Number): undefined\r\n // Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).\r\n function cancelAnimFrame(id) {\r\n \tif (id) {\r\n \t\tcancelFn.call(window, id);\r\n \t}\r\n }\n\n var Util = {\n __proto__: null,\n extend: extend,\n create: create$2,\n bind: bind,\n get lastId () { return lastId; },\n stamp: stamp,\n throttle: throttle,\n wrapNum: wrapNum,\n falseFn: falseFn,\n formatNum: formatNum,\n trim: trim,\n splitWords: splitWords,\n setOptions: setOptions,\n getParamString: getParamString,\n template: template,\n isArray: isArray,\n indexOf: indexOf,\n emptyImageUrl: emptyImageUrl,\n requestFn: requestFn,\n cancelFn: cancelFn,\n requestAnimFrame: requestAnimFrame,\n cancelAnimFrame: cancelAnimFrame\n };\n\n // @class Class\r\n // @aka L.Class\r\n\r\n // @section\r\n // @uninheritable\r\n\r\n // Thanks to John Resig and Dean Edwards for inspiration!\r\n\r\n function Class() {}\r\n\r\n Class.extend = function (props) {\r\n\r\n \t// @function extend(props: Object): Function\r\n \t// [Extends the current class](#class-inheritance) given the properties to be included.\r\n \t// Returns a Javascript function that is a class constructor (to be called with `new`).\r\n \tvar NewClass = function () {\r\n\r\n \t\tsetOptions(this);\r\n\r\n \t\t// call the constructor\r\n \t\tif (this.initialize) {\r\n \t\t\tthis.initialize.apply(this, arguments);\r\n \t\t}\r\n\r\n \t\t// call all constructor hooks\r\n \t\tthis.callInitHooks();\r\n \t};\r\n\r\n \tvar parentProto = NewClass.__super__ = this.prototype;\r\n\r\n \tvar proto = create$2(parentProto);\r\n \tproto.constructor = NewClass;\r\n\r\n \tNewClass.prototype = proto;\r\n\r\n \t// inherit parent's statics\r\n \tfor (var i in this) {\r\n \t\tif (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') {\r\n \t\t\tNewClass[i] = this[i];\r\n \t\t}\r\n \t}\r\n\r\n \t// mix static properties into the class\r\n \tif (props.statics) {\r\n \t\textend(NewClass, props.statics);\r\n \t}\r\n\r\n \t// mix includes into the prototype\r\n \tif (props.includes) {\r\n \t\tcheckDeprecatedMixinEvents(props.includes);\r\n \t\textend.apply(null, [proto].concat(props.includes));\r\n \t}\r\n\r\n \t// mix given properties into the prototype\r\n \textend(proto, props);\r\n \tdelete proto.statics;\r\n \tdelete proto.includes;\r\n\r\n \t// merge options\r\n \tif (proto.options) {\r\n \t\tproto.options = parentProto.options ? create$2(parentProto.options) : {};\r\n \t\textend(proto.options, props.options);\r\n \t}\r\n\r\n \tproto._initHooks = [];\r\n\r\n \t// add method for calling all hooks\r\n \tproto.callInitHooks = function () {\r\n\r\n \t\tif (this._initHooksCalled) { return; }\r\n\r\n \t\tif (parentProto.callInitHooks) {\r\n \t\t\tparentProto.callInitHooks.call(this);\r\n \t\t}\r\n\r\n \t\tthis._initHooksCalled = true;\r\n\r\n \t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n \t\t\tproto._initHooks[i].call(this);\r\n \t\t}\r\n \t};\r\n\r\n \treturn NewClass;\r\n };\r\n\r\n\r\n // @function include(properties: Object): this\r\n // [Includes a mixin](#class-includes) into the current class.\r\n Class.include = function (props) {\r\n \tvar parentOptions = this.prototype.options;\r\n \textend(this.prototype, props);\r\n \tif (props.options) {\r\n \t\tthis.prototype.options = parentOptions;\r\n \t\tthis.mergeOptions(props.options);\r\n \t}\r\n \treturn this;\r\n };\r\n\r\n // @function mergeOptions(options: Object): this\r\n // [Merges `options`](#class-options) into the defaults of the class.\r\n Class.mergeOptions = function (options) {\r\n \textend(this.prototype.options, options);\r\n \treturn this;\r\n };\r\n\r\n // @function addInitHook(fn: Function): this\r\n // Adds a [constructor hook](#class-constructor-hooks) to the class.\r\n Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n \tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n \tvar init = typeof fn === 'function' ? fn : function () {\r\n \t\tthis[fn].apply(this, args);\r\n \t};\r\n\r\n \tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n \tthis.prototype._initHooks.push(init);\r\n \treturn this;\r\n };\r\n\r\n function checkDeprecatedMixinEvents(includes) {\r\n \t/* global L: true */\r\n \tif (typeof L === 'undefined' || !L || !L.Mixin) { return; }\r\n\r\n \tincludes = isArray(includes) ? includes : [includes];\r\n\r\n \tfor (var i = 0; i < includes.length; i++) {\r\n \t\tif (includes[i] === L.Mixin.Events) {\r\n \t\t\tconsole.warn('Deprecated include of L.Mixin.Events: ' +\r\n \t\t\t\t'this property will be removed in future releases, ' +\r\n \t\t\t\t'please inherit from L.Evented instead.', new Error().stack);\r\n \t\t}\r\n \t}\r\n }\n\n /*\r\n * @class Evented\r\n * @aka L.Evented\r\n * @inherits Class\r\n *\r\n * 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).\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * map.on('click', function(e) {\r\n * \talert(e.latlng);\r\n * } );\r\n * ```\r\n *\r\n * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:\r\n *\r\n * ```js\r\n * function onClick(e) { ... }\r\n *\r\n * map.on('click', onClick);\r\n * map.off('click', onClick);\r\n * ```\r\n */\r\n\r\n var Events = {\r\n \t/* @method on(type: String, fn: Function, context?: Object): this\r\n \t * 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'`).\r\n \t *\r\n \t * @alternative\r\n \t * @method on(eventMap: Object): this\r\n \t * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n \t */\r\n \ton: function (types, fn, context) {\r\n\r\n \t\t// types can be a map of types/handlers\r\n \t\tif (typeof types === 'object') {\r\n \t\t\tfor (var type in types) {\r\n \t\t\t\t// we don't process space-separated events here for performance;\r\n \t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n \t\t\t\tthis._on(type, types[type], fn);\r\n \t\t\t}\r\n\r\n \t\t} else {\r\n \t\t\t// types can be a string of space-separated words\r\n \t\t\ttypes = splitWords(types);\r\n\r\n \t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n \t\t\t\tthis._on(types[i], fn, context);\r\n \t\t\t}\r\n \t\t}\r\n\r\n \t\treturn this;\r\n \t},\r\n\r\n \t/* @method off(type: String, fn?: Function, context?: Object): this\r\n \t * 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.\r\n \t *\r\n \t * @alternative\r\n \t * @method off(eventMap: Object): this\r\n \t * Removes a set of type/listener pairs.\r\n \t *\r\n \t * @alternative\r\n \t * @method off: this\r\n \t * Removes all listeners to all events on the object. This includes implicitly attached events.\r\n \t */\r\n \toff: function (types, fn, context) {\r\n\r\n \t\tif (!arguments.length) {\r\n \t\t\t// clear all listeners if called without arguments\r\n \t\t\tdelete this._events;\r\n\r\n \t\t} else if (typeof types === 'object') {\r\n \t\t\tfor (var type in types) {\r\n \t\t\t\tthis._off(type, types[type], fn);\r\n \t\t\t}\r\n\r\n \t\t} else {\r\n \t\t\ttypes = splitWords(types);\r\n\r\n \t\t\tvar removeAll = arguments.length === 1;\r\n \t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n \t\t\t\tif (removeAll) {\r\n \t\t\t\t\tthis._off(types[i]);\r\n \t\t\t\t} else {\r\n \t\t\t\t\tthis._off(types[i], fn, context);\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t}\r\n\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// attach listener (without syntactic sugar now)\r\n \t_on: function (type, fn, context, _once) {\r\n \t\tif (typeof fn !== 'function') {\r\n \t\t\tconsole.warn('wrong listener type: ' + typeof fn);\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\t// check if fn already there\r\n \t\tif (this._listens(type, fn, context) !== false) {\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\tif (context === this) {\r\n \t\t\t// Less memory footprint.\r\n \t\t\tcontext = undefined;\r\n \t\t}\r\n\r\n \t\tvar newListener = {fn: fn, ctx: context};\r\n \t\tif (_once) {\r\n \t\t\tnewListener.once = true;\r\n \t\t}\r\n\r\n \t\tthis._events = this._events || {};\r\n \t\tthis._events[type] = this._events[type] || [];\r\n \t\tthis._events[type].push(newListener);\r\n \t},\r\n\r\n \t_off: function (type, fn, context) {\r\n \t\tvar listeners,\r\n \t\t i,\r\n \t\t len;\r\n\r\n \t\tif (!this._events) {\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\tlisteners = this._events[type];\r\n \t\tif (!listeners) {\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\tif (arguments.length === 1) { // remove all\r\n \t\t\tif (this._firingCount) {\r\n \t\t\t\t// Set all removed listeners to noop\r\n \t\t\t\t// so they are not called if remove happens in fire\r\n \t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n \t\t\t\t\tlisteners[i].fn = falseFn;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t\t// clear all listeners for a type if function isn't specified\r\n \t\t\tdelete this._events[type];\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\tif (typeof fn !== 'function') {\r\n \t\t\tconsole.warn('wrong listener type: ' + typeof fn);\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\t// find fn and remove it\r\n \t\tvar index = this._listens(type, fn, context);\r\n \t\tif (index !== false) {\r\n \t\t\tvar listener = listeners[index];\r\n \t\t\tif (this._firingCount) {\r\n \t\t\t\t// set the removed listener to noop so that's not called if remove happens in fire\r\n \t\t\t\tlistener.fn = falseFn;\r\n\r\n \t\t\t\t/* copy array in case events are being fired */\r\n \t\t\t\tthis._events[type] = listeners = listeners.slice();\r\n \t\t\t}\r\n \t\t\tlisteners.splice(index, 1);\r\n \t\t}\r\n \t},\r\n\r\n \t// @method fire(type: String, data?: Object, propagate?: Boolean): this\r\n \t// Fires an event of the specified type. You can optionally provide a data\r\n \t// object — the first argument of the listener function will contain its\r\n \t// properties. The event can optionally be propagated to event parents.\r\n \tfire: function (type, data, propagate) {\r\n \t\tif (!this.listens(type, propagate)) { return this; }\r\n\r\n \t\tvar event = extend({}, data, {\r\n \t\t\ttype: type,\r\n \t\t\ttarget: this,\r\n \t\t\tsourceTarget: data && data.sourceTarget || this\r\n \t\t});\r\n\r\n \t\tif (this._events) {\r\n \t\t\tvar listeners = this._events[type];\r\n \t\t\tif (listeners) {\r\n \t\t\t\tthis._firingCount = (this._firingCount + 1) || 1;\r\n \t\t\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n \t\t\t\t\tvar l = listeners[i];\r\n \t\t\t\t\t// off overwrites l.fn, so we need to copy fn to a var\r\n \t\t\t\t\tvar fn = l.fn;\r\n \t\t\t\t\tif (l.once) {\r\n \t\t\t\t\t\tthis.off(type, fn, l.ctx);\r\n \t\t\t\t\t}\r\n \t\t\t\t\tfn.call(l.ctx || this, event);\r\n \t\t\t\t}\r\n\r\n \t\t\t\tthis._firingCount--;\r\n \t\t\t}\r\n \t\t}\r\n\r\n \t\tif (propagate) {\r\n \t\t\t// propagate the event to parents (set with addEventParent)\r\n \t\t\tthis._propagateEvent(event);\r\n \t\t}\r\n\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method listens(type: String, propagate?: Boolean): Boolean\r\n \t// @method listens(type: String, fn: Function, context?: Object, propagate?: Boolean): Boolean\r\n \t// Returns `true` if a particular event type has any listeners attached to it.\r\n \t// The verification can optionally be propagated, it will return `true` if parents have the listener attached to it.\r\n \tlistens: function (type, fn, context, propagate) {\r\n \t\tif (typeof type !== 'string') {\r\n \t\t\tconsole.warn('\"string\" type argument expected');\r\n \t\t}\r\n\r\n \t\t// we don't overwrite the input `fn` value, because we need to use it for propagation\r\n \t\tvar _fn = fn;\r\n \t\tif (typeof fn !== 'function') {\r\n \t\t\tpropagate = !!fn;\r\n \t\t\t_fn = undefined;\r\n \t\t\tcontext = undefined;\r\n \t\t}\r\n\r\n \t\tvar listeners = this._events && this._events[type];\r\n \t\tif (listeners && listeners.length) {\r\n \t\t\tif (this._listens(type, _fn, context) !== false) {\r\n \t\t\t\treturn true;\r\n \t\t\t}\r\n \t\t}\r\n\r\n \t\tif (propagate) {\r\n \t\t\t// also check parents for listeners if event propagates\r\n \t\t\tfor (var id in this._eventParents) {\r\n \t\t\t\tif (this._eventParents[id].listens(type, fn, context, propagate)) { return true; }\r\n \t\t\t}\r\n \t\t}\r\n \t\treturn false;\r\n \t},\r\n\r\n \t// returns the index (number) or false\r\n \t_listens: function (type, fn, context) {\r\n \t\tif (!this._events) {\r\n \t\t\treturn false;\r\n \t\t}\r\n\r\n \t\tvar listeners = this._events[type] || [];\r\n \t\tif (!fn) {\r\n \t\t\treturn !!listeners.length;\r\n \t\t}\r\n\r\n \t\tif (context === this) {\r\n \t\t\t// Less memory footprint.\r\n \t\t\tcontext = undefined;\r\n \t\t}\r\n\r\n \t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n \t\t\tif (listeners[i].fn === fn && listeners[i].ctx === context) {\r\n \t\t\t\treturn i;\r\n \t\t\t}\r\n \t\t}\r\n \t\treturn false;\r\n\r\n \t},\r\n\r\n \t// @method once(…): this\r\n \t// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.\r\n \tonce: function (types, fn, context) {\r\n\r\n \t\t// types can be a map of types/handlers\r\n \t\tif (typeof types === 'object') {\r\n \t\t\tfor (var type in types) {\r\n \t\t\t\t// we don't process space-separated events here for performance;\r\n \t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n \t\t\t\tthis._on(type, types[type], fn, true);\r\n \t\t\t}\r\n\r\n \t\t} else {\r\n \t\t\t// types can be a string of space-separated words\r\n \t\t\ttypes = splitWords(types);\r\n\r\n \t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n \t\t\t\tthis._on(types[i], fn, context, true);\r\n \t\t\t}\r\n \t\t}\r\n\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method addEventParent(obj: Evented): this\r\n \t// Adds an event parent - an `Evented` that will receive propagated events\r\n \taddEventParent: function (obj) {\r\n \t\tthis._eventParents = this._eventParents || {};\r\n \t\tthis._eventParents[stamp(obj)] = obj;\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method removeEventParent(obj: Evented): this\r\n \t// Removes an event parent, so it will stop receiving propagated events\r\n \tremoveEventParent: function (obj) {\r\n \t\tif (this._eventParents) {\r\n \t\t\tdelete this._eventParents[stamp(obj)];\r\n \t\t}\r\n \t\treturn this;\r\n \t},\r\n\r\n \t_propagateEvent: function (e) {\r\n \t\tfor (var id in this._eventParents) {\r\n \t\t\tthis._eventParents[id].fire(e.type, extend({\r\n \t\t\t\tlayer: e.target,\r\n \t\t\t\tpropagatedFrom: e.target\r\n \t\t\t}, e), true);\r\n \t\t}\r\n \t}\r\n };\r\n\r\n // aliases; we should ditch those eventually\r\n\r\n // @method addEventListener(…): this\r\n // Alias to [`on(…)`](#evented-on)\r\n Events.addEventListener = Events.on;\r\n\r\n // @method removeEventListener(…): this\r\n // Alias to [`off(…)`](#evented-off)\r\n\r\n // @method clearAllEventListeners(…): this\r\n // Alias to [`off()`](#evented-off)\r\n Events.removeEventListener = Events.clearAllEventListeners = Events.off;\r\n\r\n // @method addOneTimeEventListener(…): this\r\n // Alias to [`once(…)`](#evented-once)\r\n Events.addOneTimeEventListener = Events.once;\r\n\r\n // @method fireEvent(…): this\r\n // Alias to [`fire(…)`](#evented-fire)\r\n Events.fireEvent = Events.fire;\r\n\r\n // @method hasEventListeners(…): Boolean\r\n // Alias to [`listens(…)`](#evented-listens)\r\n Events.hasEventListeners = Events.listens;\r\n\r\n var Evented = Class.extend(Events);\n\n /*\r\n * @class Point\r\n * @aka L.Point\r\n *\r\n * Represents a point with `x` and `y` coordinates in pixels.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var point = L.point(200, 300);\r\n * ```\r\n *\r\n * 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:\r\n *\r\n * ```js\r\n * map.panBy([200, 300]);\r\n * map.panBy(L.point(200, 300));\r\n * ```\r\n *\r\n * Note that `Point` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\n function Point(x, y, round) {\r\n \t// @property x: Number; The `x` coordinate of the point\r\n \tthis.x = (round ? Math.round(x) : x);\r\n \t// @property y: Number; The `y` coordinate of the point\r\n \tthis.y = (round ? Math.round(y) : y);\r\n }\r\n\r\n var trunc = Math.trunc || function (v) {\r\n \treturn v > 0 ? Math.floor(v) : Math.ceil(v);\r\n };\r\n\r\n Point.prototype = {\r\n\r\n \t// @method clone(): Point\r\n \t// Returns a copy of the current point.\r\n \tclone: function () {\r\n \t\treturn new Point(this.x, this.y);\r\n \t},\r\n\r\n \t// @method add(otherPoint: Point): Point\r\n \t// Returns the result of addition of the current and the given points.\r\n \tadd: function (point) {\r\n \t\t// non-destructive, returns a new point\r\n \t\treturn this.clone()._add(toPoint(point));\r\n \t},\r\n\r\n \t_add: function (point) {\r\n \t\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n \t\tthis.x += point.x;\r\n \t\tthis.y += point.y;\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method subtract(otherPoint: Point): Point\r\n \t// Returns the result of subtraction of the given point from the current.\r\n \tsubtract: function (point) {\r\n \t\treturn this.clone()._subtract(toPoint(point));\r\n \t},\r\n\r\n \t_subtract: function (point) {\r\n \t\tthis.x -= point.x;\r\n \t\tthis.y -= point.y;\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method divideBy(num: Number): Point\r\n \t// Returns the result of division of the current point by the given number.\r\n \tdivideBy: function (num) {\r\n \t\treturn this.clone()._divideBy(num);\r\n \t},\r\n\r\n \t_divideBy: function (num) {\r\n \t\tthis.x /= num;\r\n \t\tthis.y /= num;\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method multiplyBy(num: Number): Point\r\n \t// Returns the result of multiplication of the current point by the given number.\r\n \tmultiplyBy: function (num) {\r\n \t\treturn this.clone()._multiplyBy(num);\r\n \t},\r\n\r\n \t_multiplyBy: function (num) {\r\n \t\tthis.x *= num;\r\n \t\tthis.y *= num;\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method scaleBy(scale: Point): Point\r\n \t// Multiply each coordinate of the current point by each coordinate of\r\n \t// `scale`. In linear algebra terms, multiply the point by the\r\n \t// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)\r\n \t// defined by `scale`.\r\n \tscaleBy: function (point) {\r\n \t\treturn new Point(this.x * point.x, this.y * point.y);\r\n \t},\r\n\r\n \t// @method unscaleBy(scale: Point): Point\r\n \t// Inverse of `scaleBy`. Divide each coordinate of the current point by\r\n \t// each coordinate of `scale`.\r\n \tunscaleBy: function (point) {\r\n \t\treturn new Point(this.x / point.x, this.y / point.y);\r\n \t},\r\n\r\n \t// @method round(): Point\r\n \t// Returns a copy of the current point with rounded coordinates.\r\n \tround: function () {\r\n \t\treturn this.clone()._round();\r\n \t},\r\n\r\n \t_round: function () {\r\n \t\tthis.x = Math.round(this.x);\r\n \t\tthis.y = Math.round(this.y);\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method floor(): Point\r\n \t// Returns a copy of the current point with floored coordinates (rounded down).\r\n \tfloor: function () {\r\n \t\treturn this.clone()._floor();\r\n \t},\r\n\r\n \t_floor: function () {\r\n \t\tthis.x = Math.floor(this.x);\r\n \t\tthis.y = Math.floor(this.y);\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method ceil(): Point\r\n \t// Returns a copy of the current point with ceiled coordinates (rounded up).\r\n \tceil: function () {\r\n \t\treturn this.clone()._ceil();\r\n \t},\r\n\r\n \t_ceil: function () {\r\n \t\tthis.x = Math.ceil(this.x);\r\n \t\tthis.y = Math.ceil(this.y);\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method trunc(): Point\r\n \t// Returns a copy of the current point with truncated coordinates (rounded towards zero).\r\n \ttrunc: function () {\r\n \t\treturn this.clone()._trunc();\r\n \t},\r\n\r\n \t_trunc: function () {\r\n \t\tthis.x = trunc(this.x);\r\n \t\tthis.y = trunc(this.y);\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method distanceTo(otherPoint: Point): Number\r\n \t// Returns the cartesian distance between the current and the given points.\r\n \tdistanceTo: function (point) {\r\n \t\tpoint = toPoint(point);\r\n\r\n \t\tvar x = point.x - this.x,\r\n \t\t y = point.y - this.y;\r\n\r\n \t\treturn Math.sqrt(x * x + y * y);\r\n \t},\r\n\r\n \t// @method equals(otherPoint: Point): Boolean\r\n \t// Returns `true` if the given point has the same coordinates.\r\n \tequals: function (point) {\r\n \t\tpoint = toPoint(point);\r\n\r\n \t\treturn point.x === this.x &&\r\n \t\t point.y === this.y;\r\n \t},\r\n\r\n \t// @method contains(otherPoint: Point): Boolean\r\n \t// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).\r\n \tcontains: function (point) {\r\n \t\tpoint = toPoint(point);\r\n\r\n \t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n \t\t Math.abs(point.y) <= Math.abs(this.y);\r\n \t},\r\n\r\n \t// @method toString(): String\r\n \t// Returns a string representation of the point for debugging purposes.\r\n \ttoString: function () {\r\n \t\treturn 'Point(' +\r\n \t\t formatNum(this.x) + ', ' +\r\n \t\t formatNum(this.y) + ')';\r\n \t}\r\n };\r\n\r\n // @factory L.point(x: Number, y: Number, round?: Boolean)\r\n // Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.\r\n\r\n // @alternative\r\n // @factory L.point(coords: Number[])\r\n // Expects an array of the form `[x, y]` instead.\r\n\r\n // @alternative\r\n // @factory L.point(coords: Object)\r\n // Expects a plain object of the form `{x: Number, y: Number}` instead.\r\n function toPoint(x, y, round) {\r\n \tif (x instanceof Point) {\r\n \t\treturn x;\r\n \t}\r\n \tif (isArray(x)) {\r\n \t\treturn new Point(x[0], x[1]);\r\n \t}\r\n \tif (x === undefined || x === null) {\r\n \t\treturn x;\r\n \t}\r\n \tif (typeof x === 'object' && 'x' in x && 'y' in x) {\r\n \t\treturn new Point(x.x, x.y);\r\n \t}\r\n \treturn new Point(x, y, round);\r\n }\n\n /*\r\n * @class Bounds\r\n * @aka L.Bounds\r\n *\r\n * Represents a rectangular area in pixel coordinates.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var p1 = L.point(10, 10),\r\n * p2 = L.point(40, 60),\r\n * bounds = L.bounds(p1, p2);\r\n * ```\r\n *\r\n * 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:\r\n *\r\n * ```js\r\n * otherBounds.intersects([[10, 10], [40, 60]]);\r\n * ```\r\n *\r\n * Note that `Bounds` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\n function Bounds(a, b) {\r\n \tif (!a) { return; }\r\n\r\n \tvar points = b ? [a, b] : a;\r\n\r\n \tfor (var i = 0, len = points.length; i < len; i++) {\r\n \t\tthis.extend(points[i]);\r\n \t}\r\n }\r\n\r\n Bounds.prototype = {\r\n \t// @method extend(point: Point): this\r\n \t// Extends the bounds to contain the given point.\r\n\r\n \t// @alternative\r\n \t// @method extend(otherBounds: Bounds): this\r\n \t// Extend the bounds to contain the given bounds\r\n \textend: function (obj) {\r\n \t\tvar min2, max2;\r\n \t\tif (!obj) { return this; }\r\n\r\n \t\tif (obj instanceof Point || typeof obj[0] === 'number' || 'x' in obj) {\r\n \t\t\tmin2 = max2 = toPoint(obj);\r\n \t\t} else {\r\n \t\t\tobj = toBounds(obj);\r\n \t\t\tmin2 = obj.min;\r\n \t\t\tmax2 = obj.max;\r\n\r\n \t\t\tif (!min2 || !max2) { return this; }\r\n \t\t}\r\n\r\n \t\t// @property min: Point\r\n \t\t// The top left corner of the rectangle.\r\n \t\t// @property max: Point\r\n \t\t// The bottom right corner of the rectangle.\r\n \t\tif (!this.min && !this.max) {\r\n \t\t\tthis.min = min2.clone();\r\n \t\t\tthis.max = max2.clone();\r\n \t\t} else {\r\n \t\t\tthis.min.x = Math.min(min2.x, this.min.x);\r\n \t\t\tthis.max.x = Math.max(max2.x, this.max.x);\r\n \t\t\tthis.min.y = Math.min(min2.y, this.min.y);\r\n \t\t\tthis.max.y = Math.max(max2.y, this.max.y);\r\n \t\t}\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method getCenter(round?: Boolean): Point\r\n \t// Returns the center point of the bounds.\r\n \tgetCenter: function (round) {\r\n \t\treturn toPoint(\r\n \t\t (this.min.x + this.max.x) / 2,\r\n \t\t (this.min.y + this.max.y) / 2, round);\r\n \t},\r\n\r\n \t// @method getBottomLeft(): Point\r\n \t// Returns the bottom-left point of the bounds.\r\n \tgetBottomLeft: function () {\r\n \t\treturn toPoint(this.min.x, this.max.y);\r\n \t},\r\n\r\n \t// @method getTopRight(): Point\r\n \t// Returns the top-right point of the bounds.\r\n \tgetTopRight: function () { // -> Point\r\n \t\treturn toPoint(this.max.x, this.min.y);\r\n \t},\r\n\r\n \t// @method getTopLeft(): Point\r\n \t// Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)).\r\n \tgetTopLeft: function () {\r\n \t\treturn this.min; // left, top\r\n \t},\r\n\r\n \t// @method getBottomRight(): Point\r\n \t// Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)).\r\n \tgetBottomRight: function () {\r\n \t\treturn this.max; // right, bottom\r\n \t},\r\n\r\n \t// @method getSize(): Point\r\n \t// Returns the size of the given bounds\r\n \tgetSize: function () {\r\n \t\treturn this.max.subtract(this.min);\r\n \t},\r\n\r\n \t// @method contains(otherBounds: Bounds): Boolean\r\n \t// Returns `true` if the rectangle contains the given one.\r\n \t// @alternative\r\n \t// @method contains(point: Point): Boolean\r\n \t// Returns `true` if the rectangle contains the given point.\r\n \tcontains: function (obj) {\r\n \t\tvar min, max;\r\n\r\n \t\tif (typeof obj[0] === 'number' || obj instanceof Point) {\r\n \t\t\tobj = toPoint(obj);\r\n \t\t} else {\r\n \t\t\tobj = toBounds(obj);\r\n \t\t}\r\n\r\n \t\tif (obj instanceof Bounds) {\r\n \t\t\tmin = obj.min;\r\n \t\t\tmax = obj.max;\r\n \t\t} else {\r\n \t\t\tmin = max = obj;\r\n \t\t}\r\n\r\n \t\treturn (min.x >= this.min.x) &&\r\n \t\t (max.x <= this.max.x) &&\r\n \t\t (min.y >= this.min.y) &&\r\n \t\t (max.y <= this.max.y);\r\n \t},\r\n\r\n \t// @method intersects(otherBounds: Bounds): Boolean\r\n \t// Returns `true` if the rectangle intersects the given bounds. Two bounds\r\n \t// intersect if they have at least one point in common.\r\n \tintersects: function (bounds) { // (Bounds) -> Boolean\r\n \t\tbounds = toBounds(bounds);\r\n\r\n \t\tvar min = this.min,\r\n \t\t max = this.max,\r\n \t\t min2 = bounds.min,\r\n \t\t max2 = bounds.max,\r\n \t\t xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n \t\t yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n \t\treturn xIntersects && yIntersects;\r\n \t},\r\n\r\n \t// @method overlaps(otherBounds: Bounds): Boolean\r\n \t// Returns `true` if the rectangle overlaps the given bounds. Two bounds\r\n \t// overlap if their intersection is an area.\r\n \toverlaps: function (bounds) { // (Bounds) -> Boolean\r\n \t\tbounds = toBounds(bounds);\r\n\r\n \t\tvar min = this.min,\r\n \t\t max = this.max,\r\n \t\t min2 = bounds.min,\r\n \t\t max2 = bounds.max,\r\n \t\t xOverlaps = (max2.x > min.x) && (min2.x < max.x),\r\n \t\t yOverlaps = (max2.y > min.y) && (min2.y < max.y);\r\n\r\n \t\treturn xOverlaps && yOverlaps;\r\n \t},\r\n\r\n \t// @method isValid(): Boolean\r\n \t// Returns `true` if the bounds are properly initialized.\r\n \tisValid: function () {\r\n \t\treturn !!(this.min && this.max);\r\n \t},\r\n\r\n\r\n \t// @method pad(bufferRatio: Number): Bounds\r\n \t// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\r\n \t// For example, a ratio of 0.5 extends the bounds by 50% in each direction.\r\n \t// Negative values will retract the bounds.\r\n \tpad: function (bufferRatio) {\r\n \t\tvar min = this.min,\r\n \t\tmax = this.max,\r\n \t\theightBuffer = Math.abs(min.x - max.x) * bufferRatio,\r\n \t\twidthBuffer = Math.abs(min.y - max.y) * bufferRatio;\r\n\r\n\r\n \t\treturn toBounds(\r\n \t\t\ttoPoint(min.x - heightBuffer, min.y - widthBuffer),\r\n \t\t\ttoPoint(max.x + heightBuffer, max.y + widthBuffer));\r\n \t},\r\n\r\n\r\n \t// @method equals(otherBounds: Bounds): Boolean\r\n \t// Returns `true` if the rectangle is equivalent to the given bounds.\r\n \tequals: function (bounds) {\r\n \t\tif (!bounds) { return false; }\r\n\r\n \t\tbounds = toBounds(bounds);\r\n\r\n \t\treturn this.min.equals(bounds.getTopLeft()) &&\r\n \t\t\tthis.max.equals(bounds.getBottomRight());\r\n \t},\r\n };\r\n\r\n\r\n // @factory L.bounds(corner1: Point, corner2: Point)\r\n // Creates a Bounds object from two corners coordinate pairs.\r\n // @alternative\r\n // @factory L.bounds(points: Point[])\r\n // Creates a Bounds object from the given array of points.\r\n function toBounds(a, b) {\r\n \tif (!a || a instanceof Bounds) {\r\n \t\treturn a;\r\n \t}\r\n \treturn new Bounds(a, b);\r\n }\n\n /*\r\n * @class LatLngBounds\r\n * @aka L.LatLngBounds\r\n *\r\n * Represents a rectangular geographical area on a map.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var corner1 = L.latLng(40.712, -74.227),\r\n * corner2 = L.latLng(40.774, -74.125),\r\n * bounds = L.latLngBounds(corner1, corner2);\r\n * ```\r\n *\r\n * 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:\r\n *\r\n * ```js\r\n * map.fitBounds([\r\n * \t[40.712, -74.227],\r\n * \t[40.774, -74.125]\r\n * ]);\r\n * ```\r\n *\r\n * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.\r\n *\r\n * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\n function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[])\r\n \tif (!corner1) { return; }\r\n\r\n \tvar latlngs = corner2 ? [corner1, corner2] : corner1;\r\n\r\n \tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n \t\tthis.extend(latlngs[i]);\r\n \t}\r\n }\r\n\r\n LatLngBounds.prototype = {\r\n\r\n \t// @method extend(latlng: LatLng): this\r\n \t// Extend the bounds to contain the given point\r\n\r\n \t// @alternative\r\n \t// @method extend(otherBounds: LatLngBounds): this\r\n \t// Extend the bounds to contain the given bounds\r\n \textend: function (obj) {\r\n \t\tvar sw = this._southWest,\r\n \t\t ne = this._northEast,\r\n \t\t sw2, ne2;\r\n\r\n \t\tif (obj instanceof LatLng) {\r\n \t\t\tsw2 = obj;\r\n \t\t\tne2 = obj;\r\n\r\n \t\t} else if (obj instanceof LatLngBounds) {\r\n \t\t\tsw2 = obj._southWest;\r\n \t\t\tne2 = obj._northEast;\r\n\r\n \t\t\tif (!sw2 || !ne2) { return this; }\r\n\r\n \t\t} else {\r\n \t\t\treturn obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this;\r\n \t\t}\r\n\r\n \t\tif (!sw && !ne) {\r\n \t\t\tthis._southWest = new LatLng(sw2.lat, sw2.lng);\r\n \t\t\tthis._northEast = new LatLng(ne2.lat, ne2.lng);\r\n \t\t} else {\r\n \t\t\tsw.lat = Math.min(sw2.lat, sw.lat);\r\n \t\t\tsw.lng = Math.min(sw2.lng, sw.lng);\r\n \t\t\tne.lat = Math.max(ne2.lat, ne.lat);\r\n \t\t\tne.lng = Math.max(ne2.lng, ne.lng);\r\n \t\t}\r\n\r\n \t\treturn this;\r\n \t},\r\n\r\n \t// @method pad(bufferRatio: Number): LatLngBounds\r\n \t// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\r\n \t// For example, a ratio of 0.5 extends the bounds by 50% in each direction.\r\n \t// Negative values will retract the bounds.\r\n \tpad: function (bufferRatio) {\r\n \t\tvar sw = this._southWest,\r\n \t\t ne = this._northEast,\r\n \t\t heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n \t\t widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n \t\treturn new LatLngBounds(\r\n \t\t new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n \t\t new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n \t},\r\n\r\n \t// @method getCenter(): LatLng\r\n \t// Returns the center point of the bounds.\r\n \tgetCenter: function () {\r\n \t\treturn new LatLng(\r\n \t\t (this._southWest.lat + this._northEast.lat) / 2,\r\n \t\t (this._southWest.lng + this._northEast.lng) / 2);\r\n \t},\r\n\r\n \t// @method getSouthWest(): LatLng\r\n \t// Returns the south-west point of the bounds.\r\n \tgetSouthWest: function () {\r\n \t\treturn this._southWest;\r\n \t},\r\n\r\n \t// @method getNorthEast(): LatLng\r\n \t// Returns the north-east point of the bounds.\r\n \tgetNorthEast: function () {\r\n \t\treturn this._northEast;\r\n \t},\r\n\r\n \t// @method getNorthWest(): LatLng\r\n \t// Returns the north-west point of the bounds.\r\n \tgetNorthWest: function () {\r\n \t\treturn new LatLng(this.getNorth(), this.getWest());\r\n \t},\r\n\r\n \t// @method getSouthEast(): LatLng\r\n \t// Returns the south-east point of the bounds.\r\n \tgetSouthEast: function () {\r\n \t\treturn new LatLng(this.getSouth(), this.getEast());\r\n \t},\r\n\r\n \t// @method getWest(): Number\r\n \t// Returns the west longitude of the bounds\r\n \tgetWest: function () {\r\n \t\treturn this._southWest.lng;\r\n \t},\r\n\r\n \t// @method getSouth(): Number\r\n \t// Returns the south latitude of the bounds\r\n \tgetSouth: function () {\r\n \t\treturn this._southWest.lat;\r\n \t},\r\n\r\n \t// @method getEast(): Number\r\n \t// Returns the east longitude of the bounds\r\n \tgetEast: function () {\r\n \t\treturn this._northEast.lng;\r\n \t},\r\n\r\n \t// @method getNorth(): Number\r\n \t// Returns the north latitude of the bounds\r\n \tgetNorth: function () {\r\n \t\treturn this._northEast.lat;\r\n \t},\r\n\r\n \t// @method contains(otherBounds: LatLngBounds): Boolean\r\n \t// Returns `true` if the rectangle contains the given one.\r\n\r\n \t// @alternative\r\n \t// @method contains (latlng: LatLng): Boolean\r\n \t// Returns `true` if the rectangle contains the given point.\r\n \tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n \t\tif (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) {\r\n \t\t\tobj = toLatLng(obj);\r\n \t\t} else {\r\n \t\t\tobj = toLatLngBounds(obj);\r\n \t\t}\r\n\r\n \t\tvar sw = this._southWest,\r\n \t\t ne = this._northEast,\r\n \t\t sw2, ne2;\r\n\r\n \t\tif (obj instanceof LatLngBounds) {\r\n \t\t\tsw2 = obj.getSouthWest();\r\n \t\t\tne2 = obj.getNorthEast();\r\n \t\t} else {\r\n \t\t\tsw2 = ne2 = obj;\r\n \t\t}\r\n\r\n \t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n \t\t (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n \t},\r\n\r\n \t// @method intersects(otherBounds: LatLngBounds): Boolean\r\n \t// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.\r\n \tintersects: function (bounds) {\r\n \t\tbounds = toLatLngBounds(bounds);\r\n\r\n \t\tvar sw = this._southWest,\r\n \t\t ne = this._northEast,\r\n \t\t sw2 = bounds.getSouthWest(),\r\n \t\t ne2 = bounds.getNorthEast(),\r\n\r\n \t\t latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n \t\t lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n \t\treturn latIntersects && lngIntersects;\r\n \t},\r\n\r\n \t// @method overlaps(otherBounds: LatLngBounds): Boolean\r\n \t// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.\r\n \toverlaps: function (bounds) {\r\n \t\tbounds = toLatLngBounds(bounds);\r\n\r\n \t\tvar sw = this._southWest,\r\n \t\t ne = this._northEast,\r\n \t\t sw2 = bounds.getSouthWest(),\r\n \t\t ne2 = bounds.getNorthEast(),\r\n\r\n \t\t latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),\r\n \t\t lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);\r\n\r\n \t\treturn latOverlaps && lngOverlaps;\r\n \t},\r\n\r\n \t// @method toBBoxString(): String\r\n \t// 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.\r\n \ttoBBoxString: function () {\r\n \t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n \t},\r\n\r\n \t// @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean\r\n \t// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number.\r\n \tequals: function (bounds, maxMargin) {\r\n \t\tif (!bounds) { return false; }\r\n\r\n \t\tbounds = toLatLngBounds(bounds);\r\n\r\n \t\treturn this._southWest.equals(bounds.getSouthWest(), maxMargin) &&\r\n \t\t this._northEast.equals(bounds.getNorthEast(), maxMargin);\r\n \t},\r\n\r\n \t// @method isValid(): Boolean\r\n \t// Returns `true` if the bounds are properly initialized.\r\n \tisValid: function () {\r\n \t\treturn !!(this._southWest && this._northEast);\r\n \t}\r\n };\r\n\r\n // TODO International date line?\r\n\r\n // @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)\r\n // Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.\r\n\r\n // @alternative\r\n // @factory L.latLngBounds(latlngs: LatLng[])\r\n // 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`](#map-fitbounds).\r\n function toLatLngBounds(a, b) {\r\n \tif (a instanceof LatLngBounds) {\r\n \t\treturn a;\r\n \t}\r\n \treturn new LatLngBounds(a, b);\r\n }\n\n /* @class LatLng\r\n * @aka L.LatLng\r\n *\r\n * Represents a geographical point with a certain latitude and longitude.\r\n *\r\n * @example\r\n *\r\n * ```\r\n * var latlng = L.latLng(50.5, 30.5);\r\n * ```\r\n *\r\n * 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:\r\n *\r\n * ```\r\n * map.panTo([50, 30]);\r\n * map.panTo({lon: 30, lat: 50});\r\n * map.panTo({lat: 50, lng: 30});\r\n * map.panTo(L.latLng(50, 30));\r\n * ```\r\n *\r\n * Note that `LatLng` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\n function LatLng(lat, lng, alt) {\r\n \tif (isNaN(lat) || isNaN(lng)) {\r\n \t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n \t}\r\n\r\n \t// @property lat: Number\r\n \t// Latitude in degrees\r\n \tthis.lat = +lat;\r\n\r\n \t// @property lng: Number\r\n \t// Longitude in degrees\r\n \tthis.lng = +lng;\r\n\r\n \t// @property alt: Number\r\n \t// Altitude in meters (optional)\r\n \tif (alt !== undefined) {\r\n \t\tthis.alt = +alt;\r\n \t}\r\n }\r\n\r\n LatLng.prototype = {\r\n \t// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean\r\n \t// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number.\r\n \tequals: function (obj, maxMargin) {\r\n \t\tif (!obj) { return false; }\r\n\r\n \t\tobj = toLatLng(obj);\r\n\r\n \t\tvar margin = Math.max(\r\n \t\t Math.abs(this.lat - obj.lat),\r\n \t\t Math.abs(this.lng - obj.lng));\r\n\r\n \t\treturn margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);\r\n \t},\r\n\r\n \t// @method toString(): String\r\n \t// Returns a string representation of the point (for debugging purposes).\r\n \ttoString: function (precision) {\r\n \t\treturn 'LatLng(' +\r\n \t\t formatNum(this.lat, precision) + ', ' +\r\n \t\t formatNum(this.lng, precision) + ')';\r\n \t},\r\n\r\n \t// @method distanceTo(otherLatLng: LatLng): Number\r\n \t// Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines).\r\n \tdistanceTo: function (other) {\r\n \t\treturn Earth.distance(this, toLatLng(other));\r\n \t},\r\n\r\n \t// @method wrap(): LatLng\r\n \t// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.\r\n \twrap: function () {\r\n \t\treturn Earth.wrapLatLng(this);\r\n \t},\r\n\r\n \t// @method toBounds(sizeInMeters: Number): LatLngBounds\r\n \t// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.\r\n \ttoBounds: function (sizeInMeters) {\r\n \t\tvar latAccuracy = 180 * sizeInMeters / 40075017,\r\n \t\t lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\r\n\r\n \t\treturn toLatLngBounds(\r\n \t\t [this.lat - latAccuracy, this.lng - lngAccuracy],\r\n \t\t [this.lat + latAccuracy, this.lng + lngAccuracy]);\r\n \t},\r\n\r\n \tclone: function () {\r\n \t\treturn new LatLng(this.lat, this.lng, this.alt);\r\n \t}\r\n };\r\n\r\n\r\n\r\n // @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng\r\n // Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).\r\n\r\n // @alternative\r\n // @factory L.latLng(coords: Array): LatLng\r\n // Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.\r\n\r\n // @alternative\r\n // @factory L.latLng(coords: Object): LatLng\r\n // Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.\r\n\r\n function toLatLng(a, b, c) {\r\n \tif (a instanceof LatLng) {\r\n \t\treturn a;\r\n \t}\r\n \tif (isArray(a) && typeof a[0] !== 'object') {\r\n \t\tif (a.length === 3) {\r\n \t\t\treturn new LatLng(a[0], a[1], a[2]);\r\n \t\t}\r\n \t\tif (a.length === 2) {\r\n \t\t\treturn new LatLng(a[0], a[1]);\r\n \t\t}\r\n \t\treturn null;\r\n \t}\r\n \tif (a === undefined || a === null) {\r\n \t\treturn a;\r\n \t}\r\n \tif (typeof a === 'object' && 'lat' in a) {\r\n \t\treturn new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\r\n \t}\r\n \tif (b === undefined) {\r\n \t\treturn null;\r\n \t}\r\n \treturn new LatLng(a, b, c);\r\n }\n\n /*\r\n * @namespace CRS\r\n * @crs L.CRS.Base\r\n * Object that defines coordinate reference systems for projecting\r\n * geographical points into pixel (screen) coordinates and back (and to\r\n * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See\r\n * [spatial reference system](https://en.wikipedia.org/wiki/Spatial_reference_system).\r\n *\r\n * Leaflet defines the most usual CRSs by default. If you want to use a\r\n * CRS not defined by default, take a look at the\r\n * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.\r\n *\r\n * Note that the CRS instances do not inherit from Leaflet's `Class` object,\r\n * and can't be instantiated. Also, new classes can't inherit from them,\r\n * and methods can't be added to them with the `include` function.\r\n */\r\n\r\n var CRS = {\r\n \t// @method latLngToPoint(latlng: LatLng, zoom: Number): Point\r\n \t// Projects geographical coordinates into pixel coordinates for a given zoom.\r\n \tlatLngToPoint: function (latlng, zoom) {\r\n \t\tvar projectedPoint = this.projection.project(latlng),\r\n \t\t scale = this.scale(zoom);\r\n\r\n \t\treturn this.transformation._transform(projectedPoint, scale);\r\n \t},\r\n\r\n \t// @method pointToLatLng(point: Point, zoom: Number): LatLng\r\n \t// The inverse of `latLngToPoint`. Projects pixel coordinates on a given\r\n \t// zoom into geographical coordinates.\r\n \tpointToLatLng: function (point, zoom) {\r\n \t\tvar scale = this.scale(zoom),\r\n \t\t untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n \t\treturn this.projection.unproject(untransformedPoint);\r\n \t},\r\n\r\n \t// @method project(latlng: LatLng): Point\r\n \t// Projects geographical coordinates into coordinates in units accepted for\r\n \t// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).\r\n \tproject: function (latlng) {\r\n \t\treturn this.projection.project(latlng);\r\n \t},\r\n\r\n \t// @method unproject(point: Point): LatLng\r\n \t// Given a projected coordinate returns the corresponding LatLng.\r\n \t// The inverse of `project`.\r\n \tunproject: function (point) {\r\n \t\treturn this.projection.unproject(point);\r\n \t},\r\n\r\n \t// @method scale(zoom: Number): Number\r\n \t// Returns the scale used when transforming projected coordinates into\r\n \t// pixel coordinates for a particular zoom. For example, it returns\r\n \t// `256 * 2^zoom` for Mercator-based CRS.\r\n \tscale: function (zoom) {\r\n \t\treturn 256 * Math.pow(2, zoom);\r\n \t},\r\n\r\n \t// @method zoom(scale: Number): Number\r\n \t// Inverse of `scale()`, returns the zoom level corresponding to a scale\r\n \t// factor of `scale`.\r\n \tzoom: function (scale) {\r\n \t\treturn Math.log(scale / 256) / Math.LN2;\r\n \t},\r\n\r\n \t// @method getProjectedBounds(zoom: Number): Bounds\r\n \t// Returns the projection's bounds scaled and transformed for the provided `zoom`.\r\n \tgetProjectedBounds: function (zoom) {\r\n \t\tif (this.infinite) { return null; }\r\n\r\n \t\tvar b = this.projection.bounds,\r\n \t\t s = this.scale(zoom),\r\n \t\t min = this.transformation.transform(b.min, s),\r\n \t\t max = this.transformation.transform(b.max, s);\r\n\r\n \t\treturn new Bounds(min, max);\r\n \t},\r\n\r\n \t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n \t// Returns the distance between two geographical coordinates.\r\n\r\n \t// @property code: String\r\n \t// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)\r\n \t//\r\n \t// @property wrapLng: Number[]\r\n \t// An array of two numbers defining whether the longitude (horizontal) coordinate\r\n \t// axis wraps around a given range and how. Defaults to `[-180, 180]` in most\r\n \t// geographical CRSs. If `undefined`, the longitude axis does not wrap around.\r\n \t//\r\n \t// @property wrapLat: Number[]\r\n \t// Like `wrapLng`, but for the latitude (vertical) axis.\r\n\r\n \t// wrapLng: [min, max],\r\n \t// wrapLat: [min, max],\r\n\r\n \t// @property infinite: Boolean\r\n \t// If true, the coordinate space will be unbounded (infinite in both axes)\r\n \tinfinite: false,\r\n\r\n \t// @method wrapLatLng(latlng: LatLng): LatLng\r\n \t// Returns a `LatLng` where lat and lng has been wrapped according to the\r\n \t// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.\r\n \twrapLatLng: function (latlng) {\r\n \t\tvar lng = this.wrapLng ? wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,\r\n \t\t lat = this.wrapLat ? wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,\r\n \t\t alt = latlng.alt;\r\n\r\n \t\treturn new LatLng(lat, lng, alt);\r\n \t},\r\n\r\n \t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n \t// Returns a `LatLngBounds` with the same size as the given one, ensuring\r\n \t// that its center is within the CRS's bounds.\r\n \t// Only accepts actual `L.LatLngBounds` instances, not arrays.\r\n \twrapLatLngBounds: function (bounds) {\r\n \t\tvar center = bounds.getCenter(),\r\n \t\t newCenter = this.wrapLatLng(center),\r\n \t\t latShift = center.lat - newCenter.lat,\r\n \t\t lngShift = center.lng - newCenter.lng;\r\n\r\n \t\tif (latShift === 0 && lngShift === 0) {\r\n \t\t\treturn bounds;\r\n \t\t}\r\n\r\n \t\tvar sw = bounds.getSouthWest(),\r\n \t\t ne = bounds.getNorthEast(),\r\n \t\t newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift),\r\n \t\t newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift);\r\n\r\n \t\treturn new LatLngBounds(newSw, newNe);\r\n \t}\r\n };\n\n /*\n * @namespace CRS\n * @crs L.CRS.Earth\n *\n * Serves as the base for CRS that are global such that they cover the earth.\n * Can only be used as the base for other CRS and cannot be used directly,\n * since it does not have a `code`, `projection` or `transformation`. `distance()` returns\n * meters.\n */\n\n var Earth = extend({}, CRS, {\n \twrapLng: [-180, 180],\n\n \t// Mean Earth Radius, as recommended for use by\n \t// the International Union of Geodesy and Geophysics,\n \t// see https://rosettacode.org/wiki/Haversine_formula\n \tR: 6371000,\n\n \t// distance between two geographical points using spherical law of cosines approximation\n \tdistance: function (latlng1, latlng2) {\n \t\tvar rad = Math.PI / 180,\n \t\t lat1 = latlng1.lat * rad,\n \t\t lat2 = latlng2.lat * rad,\n \t\t sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2),\n \t\t sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2),\n \t\t a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon,\n \t\t c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n \t\treturn this.R * c;\n \t}\n });\n\n /*\r\n * @namespace Projection\r\n * @projection L.Projection.SphericalMercator\r\n *\r\n * Spherical Mercator projection — the most common projection for online maps,\r\n * used by almost all free and commercial tile providers. Assumes that Earth is\r\n * a sphere. Used by the `EPSG:3857` CRS.\r\n */\r\n\r\n var earthRadius = 6378137;\r\n\r\n var SphericalMercator = {\r\n\r\n \tR: earthRadius,\r\n \tMAX_LATITUDE: 85.0511287798,\r\n\r\n \tproject: function (latlng) {\r\n \t\tvar d = Math.PI / 180,\r\n \t\t max = this.MAX_LATITUDE,\r\n \t\t lat = Math.max(Math.min(max, latlng.lat), -max),\r\n \t\t sin = Math.sin(lat * d);\r\n\r\n \t\treturn new Point(\r\n \t\t\tthis.R * latlng.lng * d,\r\n \t\t\tthis.R * Math.log((1 + sin) / (1 - sin)) / 2);\r\n \t},\r\n\r\n \tunproject: function (point) {\r\n \t\tvar d = 180 / Math.PI;\r\n\r\n \t\treturn new LatLng(\r\n \t\t\t(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\r\n \t\t\tpoint.x * d / this.R);\r\n \t},\r\n\r\n \tbounds: (function () {\r\n \t\tvar d = earthRadius * Math.PI;\r\n \t\treturn new Bounds([-d, -d], [d, d]);\r\n \t})()\r\n };\n\n /*\r\n * @class Transformation\r\n * @aka L.Transformation\r\n *\r\n * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`\r\n * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing\r\n * the reverse. Used by Leaflet in its projections code.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var transformation = L.transformation(2, 5, -1, 10),\r\n * \tp = L.point(1, 2),\r\n * \tp2 = transformation.transform(p), // L.point(7, 8)\r\n * \tp3 = transformation.untransform(p2); // L.point(1, 2)\r\n * ```\r\n */\r\n\r\n\r\n // factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)\r\n // Creates a `Transformation` object with the given coefficients.\r\n function Transformation(a, b, c, d) {\r\n \tif (isArray(a)) {\r\n \t\t// use array properties\r\n \t\tthis._a = a[0];\r\n \t\tthis._b = a[1];\r\n \t\tthis._c = a[2];\r\n \t\tthis._d = a[3];\r\n \t\treturn;\r\n \t}\r\n \tthis._a = a;\r\n \tthis._b = b;\r\n \tthis._c = c;\r\n \tthis._d = d;\r\n }\r\n\r\n Transformation.prototype = {\r\n \t// @method transform(point: Point, scale?: Number): Point\r\n \t// Returns a transformed point, optionally multiplied by the given scale.\r\n \t// Only accepts actual `L.Point` instances, not arrays.\r\n \ttransform: function (point, scale) { // (Point, Number) -> Point\r\n \t\treturn this._transform(point.clone(), scale);\r\n \t},\r\n\r\n \t// destructive transform (faster)\r\n \t_transform: function (point, scale) {\r\n \t\tscale = scale || 1;\r\n \t\tpoint.x = scale * (this._a * point.x + this._b);\r\n \t\tpoint.y = scale * (this._c * point.y + this._d);\r\n \t\treturn point;\r\n \t},\r\n\r\n \t// @method untransform(point: Point, scale?: Number): Point\r\n \t// Returns the reverse transformation of the given point, optionally divided\r\n \t// by the given scale. Only accepts actual `L.Point` instances, not arrays.\r\n \tuntransform: function (point, scale) {\r\n \t\tscale = scale || 1;\r\n \t\treturn new Point(\r\n \t\t (point.x / scale - this._b) / this._a,\r\n \t\t (point.y / scale - this._d) / this._c);\r\n \t}\r\n };\r\n\r\n // factory L.transformation(a: Number, b: Number, c: Number, d: Number)\r\n\r\n // @factory L.transformation(a: Number, b: Number, c: Number, d: Number)\r\n // Instantiates a Transformation object with the given coefficients.\r\n\r\n // @alternative\r\n // @factory L.transformation(coefficients: Array): Transformation\r\n // Expects an coefficients array of the form\r\n // `[a: Number, b: Number, c: Number, d: Number]`.\r\n\r\n function toTransformation(a, b, c, d) {\r\n \treturn new Transformation(a, b, c, d);\r\n }\n\n /*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3857\r\n *\r\n * The most common CRS for online maps, used by almost all free and commercial\r\n * tile providers. Uses Spherical Mercator projection. Set in by default in\r\n * Map's `crs` option.\r\n */\r\n\r\n var EPSG3857 = extend({}, Earth, {\r\n \tcode: 'EPSG:3857',\r\n \tprojection: SphericalMercator,\r\n\r\n \ttransformation: (function () {\r\n \t\tvar scale = 0.5 / (Math.PI * SphericalMercator.R);\r\n \t\treturn toTransformation(scale, 0.5, -scale, 0.5);\r\n \t}())\r\n });\r\n\r\n var EPSG900913 = extend({}, EPSG3857, {\r\n \tcode: 'EPSG:900913'\r\n });\n\n // @namespace SVG; @section\n // There are several static functions which can be called without instantiating L.SVG:\n\n // @function create(name: String): SVGElement\n // Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),\n // corresponding to the class name passed. For example, using 'line' will return\n // an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).\n function svgCreate(name) {\n \treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n }\n\n // @function pointsToPath(rings: Point[], closed: Boolean): String\n // Generates a SVG path string for multiple rings, with each ring turning\n // into \"M..L..L..\" instructions\n function pointsToPath(rings, closed) {\n \tvar str = '',\n \ti, j, len, len2, points, p;\n\n \tfor (i = 0, len = rings.length; i < len; i++) {\n \t\tpoints = rings[i];\n\n \t\tfor (j = 0, len2 = points.length; j < len2; j++) {\n \t\t\tp = points[j];\n \t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n \t\t}\n\n \t\t// closes the ring for polygons; \"x\" is VML syntax\n \t\tstr += closed ? (Browser.svg ? 'z' : 'x') : '';\n \t}\n\n \t// SVG complains about empty path strings\n \treturn str || 'M0 0';\n }\n\n /*\r\n * @namespace Browser\r\n * @aka L.Browser\r\n *\r\n * A namespace with static properties for browser/feature detection used by Leaflet internally.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * if (L.Browser.ielt9) {\r\n * alert('Upgrade your browser, dude!');\r\n * }\r\n * ```\r\n */\r\n\r\n var style = document.documentElement.style;\r\n\r\n // @property ie: Boolean; `true` for all Internet Explorer versions (not Edge).\r\n var ie = 'ActiveXObject' in window;\r\n\r\n // @property ielt9: Boolean; `true` for Internet Explorer versions less than 9.\r\n var ielt9 = ie && !document.addEventListener;\r\n\r\n // @property edge: Boolean; `true` for the Edge web browser.\r\n var edge = 'msLaunchUri' in navigator && !('documentMode' in document);\r\n\r\n // @property webkit: Boolean;\r\n // `true` for webkit-based browsers like Chrome and Safari (including mobile versions).\r\n var webkit = userAgentContains('webkit');\r\n\r\n // @property android: Boolean\r\n // **Deprecated.** `true` for any browser running on an Android platform.\r\n var android = userAgentContains('android');\r\n\r\n // @property android23: Boolean; **Deprecated.** `true` for browsers running on Android 2 or Android 3.\r\n var android23 = userAgentContains('android 2') || userAgentContains('android 3');\r\n\r\n /* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */\r\n var webkitVer = parseInt(/WebKit\\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit\r\n // @property androidStock: Boolean; **Deprecated.** `true` for the Android stock browser (i.e. not Chrome)\r\n var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window);\r\n\r\n // @property opera: Boolean; `true` for the Opera browser\r\n var opera = !!window.opera;\r\n\r\n // @property chrome: Boolean; `true` for the Chrome browser.\r\n var chrome = !edge && userAgentContains('chrome');\r\n\r\n // @property gecko: Boolean; `true` for gecko-based browsers like Firefox.\r\n var gecko = userAgentContains('gecko') && !webkit && !opera && !ie;\r\n\r\n // @property safari: Boolean; `true` for the Safari browser.\r\n var safari = !chrome && userAgentContains('safari');\r\n\r\n var phantom = userAgentContains('phantom');\r\n\r\n // @property opera12: Boolean\r\n // `true` for the Opera browser supporting CSS transforms (version 12 or later).\r\n var opera12 = 'OTransition' in style;\r\n\r\n // @property win: Boolean; `true` when the browser is running in a Windows platform\r\n var win = navigator.platform.indexOf('Win') === 0;\r\n\r\n // @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms.\r\n var ie3d = ie && ('transition' in style);\r\n\r\n // @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms.\r\n var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23;\r\n\r\n // @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms.\r\n var gecko3d = 'MozPerspective' in style;\r\n\r\n // @property any3d: Boolean\r\n // `true` for all browsers supporting CSS transforms.\r\n var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom;\r\n\r\n // @property mobile: Boolean; `true` for all browsers running in a mobile device.\r\n var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile');\r\n\r\n // @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device.\r\n var mobileWebkit = mobile && webkit;\r\n\r\n // @property mobileWebkit3d: Boolean\r\n // `true` for all webkit-based browsers in a mobile device supporting CSS transforms.\r\n var mobileWebkit3d = mobile && webkit3d;\r\n\r\n // @property msPointer: Boolean\r\n // `true` for browsers implementing the Microsoft touch events model (notably IE10).\r\n var msPointer = !window.PointerEvent && window.MSPointerEvent;\r\n\r\n // @property pointer: Boolean\r\n // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).\r\n var pointer = !!(window.PointerEvent || msPointer);\r\n\r\n // @property touchNative: Boolean\r\n // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).\r\n // **This does not necessarily mean** that the browser is running in a computer with\r\n // a touchscreen, it only means that the browser is capable of understanding\r\n // touch events.\r\n var touchNative = 'ontouchstart' in window || !!window.TouchEvent;\r\n\r\n // @property touch: Boolean\r\n // `true` for all browsers supporting either [touch](#browser-touch) or [pointer](#browser-pointer) events.\r\n // Note: pointer events will be preferred (if available), and processed for all `touch*` listeners.\r\n var touch = !window.L_NO_TOUCH && (touchNative || pointer);\r\n\r\n // @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device.\r\n var mobileOpera = mobile && opera;\r\n\r\n // @property mobileGecko: Boolean\r\n // `true` for gecko-based browsers running in a mobile device.\r\n var mobileGecko = mobile && gecko;\r\n\r\n // @property retina: Boolean\r\n // `true` for browsers on a high-resolution \"retina\" screen or on any screen when browser's display zoom is more than 100%.\r\n var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1;\r\n\r\n // @property passiveEvents: Boolean\r\n // `true` for browsers that support passive events.\r\n var passiveEvents = (function () {\r\n \tvar supportsPassiveOption = false;\r\n \ttry {\r\n \t\tvar opts = Object.defineProperty({}, 'passive', {\r\n \t\t\tget: function () { // eslint-disable-line getter-return\r\n \t\t\t\tsupportsPassiveOption = true;\r\n \t\t\t}\r\n \t\t});\r\n \t\twindow.addEventListener('testPassiveEventSupport', falseFn, opts);\r\n \t\twindow.removeEventListener('testPassiveEventSupport', falseFn, opts);\r\n \t} catch (e) {\r\n \t\t// Errors can safely be ignored since this is only a browser support test.\r\n \t}\r\n \treturn supportsPassiveOption;\r\n }());\r\n\r\n // @property canvas: Boolean\r\n // `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API).\r\n var canvas$1 = (function () {\r\n \treturn !!document.createElement('canvas').getContext;\r\n }());\r\n\r\n // @property svg: Boolean\r\n // `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).\r\n var svg$1 = !!(document.createElementNS && svgCreate('svg').createSVGRect);\r\n\r\n var inlineSvg = !!svg$1 && (function () {\r\n \tvar div = document.createElement('div');\r\n \tdiv.innerHTML = '';\r\n \treturn (div.firstChild && div.firstChild.namespaceURI) === 'http://www.w3.org/2000/svg';\r\n })();\r\n\r\n // @property vml: Boolean\r\n // `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).\r\n var vml = !svg$1 && (function () {\r\n \ttry {\r\n \t\tvar div = document.createElement('div');\r\n \t\tdiv.innerHTML = '';\r\n\r\n \t\tvar shape = div.firstChild;\r\n \t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n \t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n \t} catch (e) {\r\n \t\treturn false;\r\n \t}\r\n }());\r\n\r\n\r\n // @property mac: Boolean; `true` when the browser is running in a Mac platform\r\n var mac = navigator.platform.indexOf('Mac') === 0;\r\n\r\n // @property mac: Boolean; `true` when the browser is running in a Linux platform\r\n var linux = navigator.platform.indexOf('Linux') === 0;\r\n\r\n function userAgentContains(str) {\r\n \treturn navigator.userAgent.toLowerCase().indexOf(str) >= 0;\r\n }\r\n\r\n\r\n var Browser = {\r\n \tie: ie,\r\n \tielt9: ielt9,\r\n \tedge: edge,\r\n \twebkit: webkit,\r\n \tandroid: android,\r\n \tandroid23: android23,\r\n \tandroidStock: androidStock,\r\n \topera: opera,\r\n \tchrome: chrome,\r\n \tgecko: gecko,\r\n \tsafari: safari,\r\n \tphantom: phantom,\r\n \topera12: opera12,\r\n \twin: win,\r\n \tie3d: ie3d,\r\n \twebkit3d: webkit3d,\r\n \tgecko3d: gecko3d,\r\n \tany3d: any3d,\r\n \tmobile: mobile,\r\n \tmobileWebkit: mobileWebkit,\r\n \tmobileWebkit3d: mobileWebkit3d,\r\n \tmsPointer: msPointer,\r\n \tpointer: pointer,\r\n \ttouch: touch,\r\n \ttouchNative: touchNative,\r\n \tmobileOpera: mobileOpera,\r\n \tmobileGecko: mobileGecko,\r\n \tretina: retina,\r\n \tpassiveEvents: passiveEvents,\r\n \tcanvas: canvas$1,\r\n \tsvg: svg$1,\r\n \tvml: vml,\r\n \tinlineSvg: inlineSvg,\r\n \tmac: mac,\r\n \tlinux: linux\r\n };\n\n /*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\n var POINTER_DOWN = Browser.msPointer ? 'MSPointerDown' : 'pointerdown';\n var POINTER_MOVE = Browser.msPointer ? 'MSPointerMove' : 'pointermove';\n var POINTER_UP = Browser.msPointer ? 'MSPointerUp' : 'pointerup';\n var POINTER_CANCEL = Browser.msPointer ? 'MSPointerCancel' : 'pointercancel';\n var pEvent = {\n \ttouchstart : POINTER_DOWN,\n \ttouchmove : POINTER_MOVE,\n \ttouchend : POINTER_UP,\n \ttouchcancel : POINTER_CANCEL\n };\n var handle = {\n \ttouchstart : _onPointerStart,\n \ttouchmove : _handlePointer,\n \ttouchend : _handlePointer,\n \ttouchcancel : _handlePointer\n };\n var _pointers = {};\n var _pointerDocListener = false;\n\n // Provides a touch events wrapper for (ms)pointer events.\n // ref https://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n function addPointerListener(obj, type, handler) {\n \tif (type === 'touchstart') {\n \t\t_addPointerDocListener();\n \t}\n \tif (!handle[type]) {\n \t\tconsole.warn('wrong event specified:', type);\n \t\treturn falseFn;\n \t}\n \thandler = handle[type].bind(this, handler);\n \tobj.addEventListener(pEvent[type], handler, false);\n \treturn handler;\n }\n\n function removePointerListener(obj, type, handler) {\n \tif (!pEvent[type]) {\n \t\tconsole.warn('wrong event specified:', type);\n \t\treturn;\n \t}\n \tobj.removeEventListener(pEvent[type], handler, false);\n }\n\n function _globalPointerDown(e) {\n \t_pointers[e.pointerId] = e;\n }\n\n function _globalPointerMove(e) {\n \tif (_pointers[e.pointerId]) {\n \t\t_pointers[e.pointerId] = e;\n \t}\n }\n\n function _globalPointerUp(e) {\n \tdelete _pointers[e.pointerId];\n }\n\n function _addPointerDocListener() {\n \t// need to keep track of what pointers and how many are active to provide e.touches emulation\n \tif (!_pointerDocListener) {\n \t\t// we listen document as any drags that end by moving the touch off the screen get fired there\n \t\tdocument.addEventListener(POINTER_DOWN, _globalPointerDown, true);\n \t\tdocument.addEventListener(POINTER_MOVE, _globalPointerMove, true);\n \t\tdocument.addEventListener(POINTER_UP, _globalPointerUp, true);\n \t\tdocument.addEventListener(POINTER_CANCEL, _globalPointerUp, true);\n\n \t\t_pointerDocListener = true;\n \t}\n }\n\n function _handlePointer(handler, e) {\n \tif (e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { return; }\n\n \te.touches = [];\n \tfor (var i in _pointers) {\n \t\te.touches.push(_pointers[i]);\n \t}\n \te.changedTouches = [e];\n\n \thandler(e);\n }\n\n function _onPointerStart(handler, e) {\n \t// IE10 specific: MsTouch needs preventDefault. See #2000\n \tif (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) {\n \t\tpreventDefault(e);\n \t}\n \t_handlePointer(handler, e);\n }\n\n /*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n *\r\n * Note: currently most browsers fire native dblclick, with only a few exceptions\r\n * (see https://github.com/Leaflet/Leaflet/issues/7012#issuecomment-595087386)\r\n */\r\n\r\n function makeDblclick(event) {\r\n \t// in modern browsers `type` cannot be just overridden:\r\n \t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only\r\n \tvar newEvent = {},\r\n \t prop, i;\r\n \tfor (i in event) {\r\n \t\tprop = event[i];\r\n \t\tnewEvent[i] = prop && prop.bind ? prop.bind(event) : prop;\r\n \t}\r\n \tevent = newEvent;\r\n \tnewEvent.type = 'dblclick';\r\n \tnewEvent.detail = 2;\r\n \tnewEvent.isTrusted = false;\r\n \tnewEvent._simulated = true; // for debug purposes\r\n \treturn newEvent;\r\n }\r\n\r\n var delay = 200;\r\n function addDoubleTapListener(obj, handler) {\r\n \t// Most browsers handle double tap natively\r\n \tobj.addEventListener('dblclick', handler);\r\n\r\n \t// On some platforms the browser doesn't fire native dblclicks for touch events.\r\n \t// It seems that in all such cases `detail` property of `click` event is always `1`.\r\n \t// So here we rely on that fact to avoid excessive 'dblclick' simulation when not needed.\r\n \tvar last = 0,\r\n \t detail;\r\n \tfunction simDblclick(e) {\r\n \t\tif (e.detail !== 1) {\r\n \t\t\tdetail = e.detail; // keep in sync to avoid false dblclick in some cases\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\tif (e.pointerType === 'mouse' ||\r\n \t\t\t(e.sourceCapabilities && !e.sourceCapabilities.firesTouchEvents)) {\r\n\r\n \t\t\treturn;\r\n \t\t}\r\n\r\n \t\t// When clicking on an , the browser generates a click on its\r\n \t\t//