diff --git a/.flake8 b/.flake8
index a570f5e020..74f239821f 100644
--- a/.flake8
+++ b/.flake8
@@ -32,4 +32,4 @@ ignore =
# line break occurred before a binary operator - let black worry about that
W503
# line break occurred after a binary operator - let black worry about that
- W504
+ W504
\ No newline at end of file
diff --git a/.github/workflows/build-mapscript-php.yml b/.github/workflows/build-mapscript-php.yml
index 3ce61bcbfa..7c93fc8770 100644
--- a/.github/workflows/build-mapscript-php.yml
+++ b/.github/workflows/build-mapscript-php.yml
@@ -30,7 +30,7 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Python
uses: actions/setup-python@v5
diff --git a/.github/workflows/build-mapscript-python.yml b/.github/workflows/build-mapscript-python.yml
index d14bd36c01..d164973725 100644
--- a/.github/workflows/build-mapscript-python.yml
+++ b/.github/workflows/build-mapscript-python.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Python
uses: actions/setup-python@v5
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 4511b81bfe..5e27badfb5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -29,7 +29,7 @@ jobs:
steps:
- name: Checkout repository contents
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Build
run: |
diff --git a/.github/workflows/build_alpine.yml b/.github/workflows/build_alpine.yml
index e1f6861d7e..3fe2b2262a 100644
--- a/.github/workflows/build_alpine.yml
+++ b/.github/workflows/build_alpine.yml
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Checkout repository contents
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Build
run: |
diff --git a/.github/workflows/check-crlf.yml b/.github/workflows/check-crlf.yml
index 1df7d3136b..9bd0b81fc0 100644
--- a/.github/workflows/check-crlf.yml
+++ b/.github/workflows/check-crlf.yml
@@ -19,9 +19,9 @@ jobs:
steps:
- name: Checkout repository contents
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Use action to check for CRLF endings
- uses: erclu/check-crlf@v1.2.0
+ uses: erclu/check-crlf@master
with: # ignore directories containing *.pdf and *.tab
exclude: msautotest/misc/data/ /msautotest/renderers/expected/
diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml
index d3a61b0807..cf95b1280e 100644
--- a/.github/workflows/code_checks.yml
+++ b/.github/workflows/code_checks.yml
@@ -14,8 +14,8 @@ jobs:
linting:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
+ - uses: actions/checkout@v5
+ - uses: actions/setup-python@v6
with:
python-version: '3.12'
- uses: pre-commit/action@v3.0.1
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 1467a258e2..b0c519edd7 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -37,7 +37,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml
index 00f0f6b823..1f023a11c4 100644
--- a/.github/workflows/conda.yml
+++ b/.github/workflows/conda.yml
@@ -15,7 +15,7 @@ jobs:
os: [macos-latest, windows-latest, ubuntu-latest]
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ilammy/msvc-dev-cmd@v1
if: matrix.os == 'windows-latest'
- name: Support longpaths
diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml
index 4ea9667da7..9b4edea437 100644
--- a/.github/workflows/coverity-scan.yml
+++ b/.github/workflows/coverity-scan.yml
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-20.04
if: github.repository == 'MapServer/MapServer'
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install Libraries
run: |
diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml
index 4e2970b091..e6b19101ef 100644
--- a/.github/workflows/cppcheck.yml
+++ b/.github/workflows/cppcheck.yml
@@ -16,7 +16,7 @@ jobs:
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Install Requirements
run: |
diff --git a/.github/workflows/start.sh b/.github/workflows/start.sh
index 19998de616..3dd3d98158 100755
--- a/.github/workflows/start.sh
+++ b/.github/workflows/start.sh
@@ -9,7 +9,7 @@ export PYTHON_VERSION=system
LANG=en_US.UTF-8
export LANG
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
- sudo locales tzdata software-properties-common python3-dev python3-pip python3-setuptools git curl \
+ sudo locales tzdata software-properties-common python3-dev python3-venv python3-pip python3-setuptools git curl \
apt-transport-https ca-certificates gnupg software-properties-common wget
#install PHP 8.1
DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:ondrej/php -y
@@ -41,8 +41,8 @@ ci/ubuntu/setup.sh
ci/ubuntu/build.sh
# Validate openapi document
-pip install check-jsonschema
-wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.0/schema.yaml -O openapi_schema.yaml
+pip install check-jsonschema --break-system-packages
+wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/refs/heads/main/_archive_/schemas/v3.0/schema.yaml -O openapi_schema.yaml
echo "Run check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json"
check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6465ead931..819ddec657 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -9,7 +9,7 @@ repos:
- id: isort
args: ["--profile", "black"]
- repo: https://github.com/pycqa/flake8
- rev: 7.1.1
+ rev: 7.2.0
hooks:
- id: flake8
- repo: https://github.com/pre-commit/mirrors-clang-format
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 0000000000..f677f2b085
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,64 @@
+cff-version: 1.2.0
+title: MapServer
+message: If you use this software, please cite it using the metadata from this file.
+version: 8.4.1
+date-released: 2025-09-19
+abstract: MapServer is an Open Source platform for publishing spatial data and interactive mapping applications to the web.
+type: software
+authors:
+ - family-names: McKenna
+ given-names: Jeff
+ affiliation: GatewayGeo
+ orcid: https://orcid.org/0000-0003-3900-1863
+ - family-names: Lime
+ given-names: Steve
+ affiliation: MNIT DNR
+ - family-names: Bonfort
+ given-names: Thomas
+ affiliation: Airbus
+ - family-names: Boué
+ given-names: Jérome
+ - family-names: Butler
+ given-names: Howard
+ affiliation: Hobu Inc
+ orcid: https://orcid.org/0000-0002-5340-1380
+ - family-names: Girvin
+ given-names: Seth
+ affiliation: Geographika
+ - family-names: Kralidis
+ given-names: Tom
+ - family-names: Meissl
+ given-names: Stephan
+ affiliation: EOX
+ orcid: https://orcid.org/0000-0002-1407-8859
+ - family-names: Morissette
+ given-names: Daniel
+ affiliation: Mapgears
+ - family-names: Nacionales
+ given-names: Perry
+ affiliation: University of Minnesota
+ - family-names: Rahkonen
+ given-names: Jukka
+ affiliation: National Land Survey of Finland
+ - family-names: Rouault
+ given-names: Even
+ affiliation: Spatialys
+ orcid: https://orcid.org/0000-0002-5068-0476
+ - family-names: Smith
+ given-names: Mike
+ affiliation: US Army Corps of Engineers
+ - family-names: Szekeres
+ given-names: Tamas
+repository-code: https://github.com/MapServer/MapServer
+license: MIT
+doi: 10.5281/zenodo.6994443
+keywords:
+ - web
+ - geospatial
+ - software
+ - ogc
+ - standards
+ - gdal
+ - open source
+ - free software
+ - MIT
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 655eee5c87..f324dbd224 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,14 +16,14 @@ include(CheckIncludeFile)
include(CheckCSourceCompiles)
set (MapServer_VERSION_MAJOR 8)
-set (MapServer_VERSION_MINOR 3)
-set (MapServer_VERSION_REVISION 0)
+set (MapServer_VERSION_MINOR 4)
+set (MapServer_VERSION_REVISION 1)
set (MapServer_VERSION_SUFFIX "")
# Set C++ version
# Make CMAKE_CXX_STANDARD available as cache option overridable by user
-set(CMAKE_CXX_STANDARD 11
- CACHE STRING "C++ standard version to use (default is 11)")
+set(CMAKE_CXX_STANDARD 17
+ CACHE STRING "C++ standard version to use (default is 17)")
message(STATUS "Requiring C++${CMAKE_CXX_STANDARD}")
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
@@ -31,8 +31,8 @@ message(STATUS "Requiring C++${CMAKE_CXX_STANDARD} - done")
# Set C version
# Make CMAKE_C_STANDARD available as cache option overridable by user
-set(CMAKE_C_STANDARD 11
- CACHE STRING "C standard version to use (default is 11)")
+set(CMAKE_C_STANDARD 17
+ CACHE STRING "C standard version to use (default is 17)")
message(STATUS "Requiring C${CMAKE_C_STANDARD}")
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
diff --git a/HISTORY.md b/HISTORY.md
index 5a163b493e..8b836f3f37 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -13,6 +13,48 @@ https://mapserver.org/development/changelog/
The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html
+8.4.1 release (2025-09-19)
+--------------------------
+
+- security: add missing column name escaping for WFS filters through OGR (#7349)
+
+- fix opacity for gradient legend symbol (#7255)
+
+see detailed changelog for other fixes
+
+8.4.0 release (2025-01-15)
+--------------------------
+
+- add CITATION.cff, useful for Zenodo/DOI (#7209)
+(see major changes below)
+
+8.4.0-rc1 release (2025-01-08)
+------------------------------
+
+- include stdbool.h in mapserver.h (#7205)
+
+8.4.0-beta2 release (2024-12-14)
+--------------------------------
+
+- add explicit error message when proj.db cannot be found (#7203)
+
+8.4.0-beta1 release (2024-12-13)
+--------------------------------
+
+- add PCRE2 support (#7073)
+
+- add CONNECTIONTYPE RASTERLABEL (#7135)
+
+- set MS_LEGEND_KEYSIZE_MAX to 1000 (#7154)
+
+- add 4 new COMPOSITE.COMPOP blending operations (#7065)
+
+- allow encryption key files to use paths relative to a mapfile (#7181)
+
+- allow use_default_extent_for_getfeature to be used for OGC Features API and PostGIS (#7197)
+
+see detailed changelog for other fixes
+
8.2.2 release (2024-09-02)
--------------------------
diff --git a/INSTALL.CMAKE b/INSTALL.CMAKE
index 2b3fbda00e..08b28fac46 100644
--- a/INSTALL.CMAKE
+++ b/INSTALL.CMAKE
@@ -125,7 +125,7 @@ Refer to the CMakeLists.txt file for up-to-date options.
- option(WITH_KML "Enable native KML output support (requires libxml2 support)" OFF)
- option(WITH_SOS "Enable SOS Server support (requires PROJ and libxml2 support)" OFF)
- option(WITH_WMS "Enable WMS Server support (requires proj support)" ON)
- - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for left-to-right languages)(requires harfbuzz)" ON)
+ - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for right-to-left languages)(requires harfbuzz)" ON)
- option(WITH_HARFBUZZ "Choose if Harfbuzz complex script glyph shaping support should be built in (requires fribidi)" ON)
- option(WITH_ICONV "Choose if Iconv Internationalization support should be built in" ON)
- option(WITH_CAIRO "Choose if CAIRO rendering support should be built in (required for SVG and PDF output)" ON)
diff --git a/LICENSE.md b/LICENSE.md
index 5ad42611da..fa495ab2b8 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -4,7 +4,7 @@ MapServer Licensing
MapServer General
-----------------
-Copyright (c) 2008-2024 Open Source Geospatial Foundation.
+Copyright (c) 2008-2025 Open Source Geospatial Foundation.
Copyright (c) 1996-2008 Regents of the University of Minnesota.
Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/SECURITY.md b/SECURITY.md
index 43e72602a5..008f2a9c44 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,8 +2,10 @@
## Reporting a Vulnerability in MapServer
-Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists, but instead please send your report
-to the email address: **mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’).
+Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists,
+but instead please provide details to the Project Steering Committee via the GitHub [Report a vulnerability](https://github.com/MapServer/MapServer/security/advisories/new)
+option link at the top of this page, or send your report to the email address:
+**mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’).
Please follow the general guidelines for bug
submissions, when describing the vulnerability (see https://mapserver.org/development/bugs.html).
@@ -13,17 +15,18 @@ submissions, when describing the vulnerability (see https://mapserver.org/develo
The MapServer PSC (Project Steering Committee) will release patches for security vulnerabilities
for the last release branch of the **two most recent release series** (such as 8.x, 7.x, 6.x, etc...,
where "x" is the most recent release in the series, such as: 7.6.6 being supported, but
-not 7.6.5). For example, once 8.4 is released, support for 8.2 will be dropped.
+not 7.6.5). For example, once 8.6 is released, support for 8.4 will be dropped.
Patches will only be provided **for a period of three years** from the release date of the current series.
-For example, as 8.2 has been released, now 8.2.x, and 7.6.x will be supported/patched, and 7.6.x will
+For example, as 8.4 has been released, now 8.4.x, and 7.6.x will be supported/patched, and 7.6.x will
only be supported for three years from the date of the 8.0 series release (until 2025-09-12).
Currently, the following versions are supported:
| Version | Supported | Support Until |
| ------- | ------------------ |-------------- |
-| 8.2.x | :white_check_mark: | |
+| 8.4.x | :white_check_mark: | |
+| 8.2.x | :x: | |
| 8.0.x | :x: | |
| 7.6.x | :white_check_mark: | 2025-09-12 |
| 7.4.x | :x: | |
@@ -32,6 +35,7 @@ Currently, the following versions are supported:
| 6.4.x | :x: | |
| < 6.4 | :x: | |
+- _MapServer 8.4.0 was released on 2025-01-15_
- _MapServer 8.2.0 was released on 2024-07-08_
- _MapServer 8.0.0 was released on 2022-09-12_
- _MapServer 7.0.0 was released on 2015-07-24_
diff --git a/appveyor.yml b/appveyor.yml
index ccf6e4db0a..a2ccf10e93 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -91,6 +91,7 @@ build_script:
# set the MapScript custom environment variable for python 3.8+
- set MAPSERVER_DLL_PATH=%BUILD_FOLDER%/build/Release;%SDK_BIN%
- set PROJ_DATA=%SDK_BIN%/proj9/SHARE
+ - set CURL_CA_BUNDLE=%SDK_BIN%/curl-ca-bundle.crt
# ensure the GIF driver is available for tests
- set GDAL_DRIVER_PATH=%SDK_BIN%/gdal/plugins
# check the mapserver exe can run
@@ -100,8 +101,9 @@ build_script:
before_test:
- set PATH=%SDK_BIN%/gdal/apps;%PATH%;
- cd %BUILD_FOLDER%/msautotest
+ - set PIP_NO_PYTHON_VERSION_WARNING=1
- "./mssql/create_mssql_db.bat"
- - "%Python_ROOT_DIR%/python -m pip install -U -r requirements.txt"
+ - "%Python_ROOT_DIR%/python -m pip install --no-warn-script-location -U -r requirements.txt"
- "%Python_ROOT_DIR%/python -m pip install --no-index --find-links=file://%BUILD_FOLDER%/build/src/mapscript/python/Release/dist mapscript"
test_script:
diff --git a/ci/ubuntu/setup.sh b/ci/ubuntu/setup.sh
index c4011e40a6..e7ca557a0b 100755
--- a/ci/ubuntu/setup.sh
+++ b/ci/ubuntu/setup.sh
@@ -33,7 +33,7 @@ cmake --version
# upgrade to recent SWIG
git clone https://github.com/swig/swig.git swig-git-master
cd swig-git-master
-wget https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.gz
+wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.gz
./Tools/pcre-build.sh
./autogen.sh
./configure --prefix=/usr
diff --git a/cmake/FindCairo.cmake b/cmake/FindCairo.cmake
index 33dfc1c2cc..b28d3b187b 100644
--- a/cmake/FindCairo.cmake
+++ b/cmake/FindCairo.cmake
@@ -38,14 +38,11 @@ FIND_PATH(CAIRO_INCLUDE_DIR
PATH_SUFFIXES cairo
)
-IF(APPLE)
- #On Mountain Lion we need this for the XQuartz supplied version of cairo
- PKG_CHECK_MODULES(PC_FONTCONFIG fontconfig) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call.
- FIND_PATH(FC_INCLUDE_DIR
- NAMES fontconfig/fontconfig.h
- HINTS ${PC_FONTCONFIG_INCLUDEDIR}
- )
-ENDIF(APPLE)
+PKG_CHECK_MODULES(PC_FONTCONFIG fontconfig) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call.
+FIND_PATH(FC_INCLUDE_DIR
+ NAMES fontconfig/fontconfig.h
+ HINTS ${PC_FONTCONFIG_INCLUDEDIR}
+)
FIND_LIBRARY(CAIRO_LIBRARY
NAMES cairo
diff --git a/etc/mapserver-sample.conf b/etc/mapserver-sample.conf
index 331e7a2725..ebf6dc1fd7 100644
--- a/etc/mapserver-sample.conf
+++ b/etc/mapserver-sample.conf
@@ -12,7 +12,7 @@ CONFIG
#
# MS_MAP_NO_PATH "1"
MS_MAP_PATTERN "^/opt/mapserver" ## required when referencing mapfiles by path
- # MS_MAP_BAD_PATTERN "[/\\]{2}|[/\\]?\\.+[/\\]|,"
+ # MS_MAP_BAD_PATTERN "[/\\\\]{2}|[/\\\\]?\\.+[/\\\\]|,"
#
# Global Log/Debug Setup
@@ -37,7 +37,7 @@ CONFIG
#
# Proj Library
#
- # PROJ_LIB "/usr/local/share/proj"
+ # PROJ_DATA "/usr/local/share/proj"
#
# Request Control
diff --git a/fuzzers/build.sh b/fuzzers/build.sh
index 52eb32d5e6..164ee98dfa 100755
--- a/fuzzers/build.sh
+++ b/fuzzers/build.sh
@@ -80,7 +80,7 @@ for fuzzer in mapfuzzer shapefuzzer configfuzzer; do
$CXX $CXXFLAGS $LIB_FUZZING_ENGINE ${fuzzer}.o -o ${fuzzer} \
-L. -lmapserver_static -lgdal \
-Wl,-Bstatic -lpng -ljpeg -lfreetype -lproj -lxml2 -lz -lsqlite3 -llzma \
- -Wl,-Bdynamic -lpthread -ldl -lc++
+ -Wl,-Bdynamic -lpthread -ldl -lc++ -lclang_rt.builtins
cp ${fuzzer} $OUT/
done
diff --git a/msautotest/api/7305_multipolygon.map b/msautotest/api/7305_multipolygon.map
new file mode 100644
index 0000000000..0e6b58c146
--- /dev/null
+++ b/msautotest/api/7305_multipolygon.map
@@ -0,0 +1,46 @@
+# RUN_PARMS: ogcapi_collections_multipolygon_items.json [MAPSERV] "PATH_INFO=/[MAPFILE]/ogcapi/collections/multipolygon_layer/items" "QUERY_STRING=f=json" > [RESULT_DEMIME]
+# RUN_PARMS: ogcapi_collections_multipolygon_items.html [MAPSERV] "PATH_INFO=/[MAPFILE]/ogcapi/collections/multipolygon_layer/items" "QUERY_STRING=f=html" > [RESULT_DEMIME]
+
+MAP
+ EXTENT -23422614 -11650014 23758273 18540865
+ SIZE 800 800
+
+ PROJECTION
+ "+init=epsg:4326"
+ END
+ UNITS METERS
+
+ WEB
+ METADATA
+ "oga_html_template_directory" "../../share/ogcapi/templates/html-plain"
+ "oga_title" "Pull Request #7305"
+ "oga_description" "This is a test OGC API server description for pull request #7305."
+ "oga_onlineresource" "http://localhost/cgi-bin/mapserv/7305/ogcapi"
+ "oga_server_description" "Server description"
+ "oga_enable_request" "OGCAPI"
+ "oga_geometry_precision" "4"
+ "oga_compliance_mode" "true"
+ END
+ END
+
+ LAYER
+ NAME "multipolygon_layer"
+ DATA "data/7305-multipolygon"
+ TYPE POLYGON
+ STATUS OFF
+ METADATA
+ "oga_keywords" "multipolygon"
+ "oga_description" "Layer with multipolygon with holes"
+ "oga_title" "Multipolygon layer"
+ "oga_featureid" "ogc_fid"
+ END
+ VALIDATION
+ "ogc_fid" "^3$" # only one acceptable value
+ END
+ PROJECTION
+ "+init=epsg:4326"
+ END
+ TEMPLATE VOID
+ END
+END
+
\ No newline at end of file
diff --git a/msautotest/api/data/7305-multipolygon.dbf b/msautotest/api/data/7305-multipolygon.dbf
new file mode 100644
index 0000000000..555e8ebb42
Binary files /dev/null and b/msautotest/api/data/7305-multipolygon.dbf differ
diff --git a/msautotest/api/data/7305-multipolygon.prj b/msautotest/api/data/7305-multipolygon.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/api/data/7305-multipolygon.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/api/data/7305-multipolygon.shp b/msautotest/api/data/7305-multipolygon.shp
new file mode 100644
index 0000000000..22e8af72bd
Binary files /dev/null and b/msautotest/api/data/7305-multipolygon.shp differ
diff --git a/msautotest/api/data/7305-multipolygon.shx b/msautotest/api/data/7305-multipolygon.shx
new file mode 100644
index 0000000000..e348e6119f
Binary files /dev/null and b/msautotest/api/data/7305-multipolygon.shx differ
diff --git a/msautotest/api/expected/ogcapi_api.json b/msautotest/api/expected/ogcapi_api.json
index b12f7242d8..fe0cc1914f 100644
--- a/msautotest/api/expected/ogcapi_api.json
+++ b/msautotest/api/expected/ogcapi_api.json
@@ -1 +1 @@
-{"components":{"parameters":{"f":{"description":"The optional f parameter indicates the output format which the server shall provide as part of the response document. The default format is GeoJSON.","explode":false,"in":"query","name":"f","required":false,"schema":{"default":"json","enum":["json","html"],"type":"string"},"style":"form"},"offset":{"description":"The optional offset parameter indicates the index within the result set from which the server shall begin presenting results in the response document. The first element has an index of 0 (default).","explode":false,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"},"style":"form"}},"responses":{"200":{"description":"successful operation"},"default":{"content":{"application/json":{"schema":{"$ref":"https://raw.githubusercontent.com/opengeospatial/ogcapi-processes/master/core/openapi/schemas/exception.yaml"}}},"description":"unexpected error"}}},"info":{"contact":{"email":"email@example.com","name":"Contact person","url":"http://example.com/contact"},"description":"This is a test OGC API server description set via oga_description.","termsOfService":"Terms of Service","title":"OGC API Test","version":"1.0.0","x-keywords":"keyword1,keyword2"},"openapi":"3.0.2","paths":{"/":{"get":{"description":"Landing page","operationId":"getLandingPage","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/LandingPage"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Landing page","tags":["server"]}},"/api":{"get":{"description":"API documentation","operationId":"getOpenapi","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"#/components/responses/200"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"default":{"$ref":"#/components/responses/default"}},"summary":"API documentation","tags":["server"]}},"/collections":{"get":{"description":"Collections","operationId":"getCollections","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collections"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Collections","tags":["server"]}},"/collections/mn_counties":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"describemn_countiesCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries metadata","tags":["mn_counties"]}},"/collections/mn_counties/items":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries items","tags":["mn_counties"]}},"/collections/mn_counties/items/{featureId}":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries item by id","tags":["mn_counties"]}},"/collections/mn_major_rivers":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"describemn_major_riversCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines metadata","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines items","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items/{featureId}":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines item by id","tags":["mn_major_rivers"]}},"/collections/mn_population_centers":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"describemn_population_centersCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers metadata","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers items","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items/{featureId}":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers item by id","tags":["mn_population_centers"]}},"/conformance":{"get":{"description":"API conformance definition","operationId":"getConformanceDeclaration","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ConformanceDeclaration"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"API conformance definition","tags":["server"]}}},"servers":[{"description":"Server description","url":"http://localhost/cgi-bin/mapserv/OGCAPI_TEST/ogcapi"}],"tags":[]}
+{"components":{"parameters":{"f":{"description":"The optional f parameter indicates the output format which the server shall provide as part of the response document. The default format is GeoJSON.","explode":false,"in":"query","name":"f","required":false,"schema":{"default":"json","enum":["json","html"],"type":"string"},"style":"form"},"offset":{"description":"The optional offset parameter indicates the index within the result set from which the server shall begin presenting results in the response document. The first element has an index of 0 (default).","explode":false,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"},"style":"form"}},"responses":{"200":{"description":"successful operation"},"default":{"content":{"application/json":{"schema":{"$ref":"https://schemas.opengis.net/ogcapi/common/part1/1.0/openapi/schemas/exception.yaml"}}},"description":"unexpected error"}}},"info":{"contact":{"email":"email@example.com","name":"Contact person","url":"http://example.com/contact"},"description":"This is a test OGC API server description set via oga_description.","termsOfService":"Terms of Service","title":"OGC API Test","version":"1.0.0","x-keywords":"keyword1,keyword2"},"openapi":"3.0.2","paths":{"/":{"get":{"description":"Landing page","operationId":"getLandingPage","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/LandingPage"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Landing page","tags":["server"]}},"/api":{"get":{"description":"API documentation","operationId":"getOpenapi","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"#/components/responses/200"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"default":{"$ref":"#/components/responses/default"}},"summary":"API documentation","tags":["server"]}},"/collections":{"get":{"description":"Collections","operationId":"getCollections","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collections"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Collections","tags":["server"]}},"/collections/mn_counties":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"describemn_countiesCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries metadata","tags":["mn_counties"]}},"/collections/mn_counties/items":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries items","tags":["mn_counties"]}},"/collections/mn_counties/items/{featureId}":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries item by id","tags":["mn_counties"]}},"/collections/mn_major_rivers":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"describemn_major_riversCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines metadata","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines items","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items/{featureId}":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines item by id","tags":["mn_major_rivers"]}},"/collections/mn_population_centers":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"describemn_population_centersCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers metadata","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers items","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items/{featureId}":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers item by id","tags":["mn_population_centers"]}},"/conformance":{"get":{"description":"API conformance definition","operationId":"getConformanceDeclaration","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ConformanceDeclaration"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"API conformance definition","tags":["server"]}}},"servers":[{"description":"Server description","url":"http://localhost/cgi-bin/mapserv/OGCAPI_TEST/ogcapi"}],"tags":[]}
diff --git a/msautotest/api/expected/ogcapi_collections_multipolygon_items.html b/msautotest/api/expected/ogcapi_collections_multipolygon_items.html
new file mode 100644
index 0000000000..e12729b4a8
--- /dev/null
+++ b/msautotest/api/expected/ogcapi_collections_multipolygon_items.html
@@ -0,0 +1,39 @@
+
+
+
+ Pull Request #7305
+
+
+
+
+
+Pull Request #7305 - Collection Items: Multipolygon layer
+
+
+ Number of matching items: 1
+ Number of returned items: 1
+
+
+
+
+
+
+
+
+
+
diff --git a/msautotest/api/expected/ogcapi_collections_multipolygon_items.json b/msautotest/api/expected/ogcapi_collections_multipolygon_items.json
new file mode 100644
index 0000000000..8fdc2ef557
--- /dev/null
+++ b/msautotest/api/expected/ogcapi_collections_multipolygon_items.json
@@ -0,0 +1 @@
+{"features":[{"geometry":{"coordinates":[[[[8.9216,45.5746],[8.8919,45.6027],[8.936,45.607],[8.9413,45.599],[8.9413,45.599],[8.9329,45.5924],[8.9216,45.5746],[8.9216,45.5746]],[[8.9112,45.6001],[8.9178,45.5871],[8.9308,45.5933],[8.9256,45.6004],[8.9112,45.6001]],[[8.9234,45.5865],[8.92,45.5851],[8.9208,45.5803],[8.9263,45.5832],[8.9234,45.5865]]],[[[8.9341,45.5868],[8.9337,45.5819],[8.9409,45.5836],[8.9387,45.5894],[8.9341,45.5868]]]],"type":"MultiPolygon"},"id":"3.000000000000000","properties":{},"type":"Feature"}],"links":[{"href":"http://localhost/cgi-bin/mapserv/7305/ogcapi/collections/multipolygon_layer/items?f=json&limit=10&offset=0","rel":"self","title":"Items for this collection as GeoJSON","type":"application/geo+json"},{"href":"http://localhost/cgi-bin/mapserv/7305/ogcapi/collections/multipolygon_layer/items?f=html&limit=10&offset=0","rel":"alternate","title":"Items for this collection as HTML","type":"text/html"}],"numberMatched":1,"numberReturned":1,"type":"FeatureCollection"}
diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.cpg b/msautotest/gdal/data/tile_index_paths_special_chars.cpg
new file mode 100644
index 0000000000..cd89cb9758
--- /dev/null
+++ b/msautotest/gdal/data/tile_index_paths_special_chars.cpg
@@ -0,0 +1 @@
+ISO-8859-1
\ No newline at end of file
diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.dbf b/msautotest/gdal/data/tile_index_paths_special_chars.dbf
new file mode 100644
index 0000000000..3e2b1ae75d
Binary files /dev/null and b/msautotest/gdal/data/tile_index_paths_special_chars.dbf differ
diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.prj b/msautotest/gdal/data/tile_index_paths_special_chars.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/gdal/data/tile_index_paths_special_chars.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.shp b/msautotest/gdal/data/tile_index_paths_special_chars.shp
new file mode 100644
index 0000000000..446004ecdc
Binary files /dev/null and b/msautotest/gdal/data/tile_index_paths_special_chars.shp differ
diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.shx b/msautotest/gdal/data/tile_index_paths_special_chars.shx
new file mode 100644
index 0000000000..3812591d93
Binary files /dev/null and b/msautotest/gdal/data/tile_index_paths_special_chars.shx differ
diff --git "a/msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif" "b/msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif"
new file mode 100644
index 0000000000..48faeb6a1f
Binary files /dev/null and "b/msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif" differ
diff --git a/msautotest/gdal/expected/tileindex_special_chars.png b/msautotest/gdal/expected/tileindex_special_chars.png
new file mode 100644
index 0000000000..1f7d3c2be1
Binary files /dev/null and b/msautotest/gdal/expected/tileindex_special_chars.png differ
diff --git a/msautotest/gdal/tileindex_special_characters.map b/msautotest/gdal/tileindex_special_characters.map
new file mode 100644
index 0000000000..f40f97707a
--- /dev/null
+++ b/msautotest/gdal/tileindex_special_characters.map
@@ -0,0 +1,35 @@
+#
+# REQUIRES: INPUT=SHAPE OUTPUT=PNG
+#
+# RUN_PARMS: tileindex_special_chars.png [MAP2IMG] -m [MAPFILE] -l special_character_path -o [RESULT]
+#
+# Test tileindex with special characters in location value
+
+MAP
+
+NAME TEST
+STATUS ON
+SIZE 100 100
+EXTENT -117.6409662 33.8479548 -117.6080786 33.8754608
+IMAGECOLOR 0 0 0
+
+PROJECTION
+ "+init=epsg:4326"
+END
+
+IMAGETYPE png
+
+LAYER
+ NAME special_character_path
+ TYPE raster
+ STATUS default
+ TEMPLATE "fake.html"
+ TILEINDEX "./data/tile_index_paths_special_chars.shp"
+ TILEITEM "location"
+ TILESRS "src_srs"
+ PROJECTION
+ "+proj=latlong +datum=WGS84"
+ END
+END
+
+END # of map file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.cpg b/msautotest/misc/data/shp_encoding/encoding_1250.cpg
new file mode 100644
index 0000000000..746faa2a85
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1250.cpg
@@ -0,0 +1 @@
+1250
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.dbf b/msautotest/misc/data/shp_encoding/encoding_1250.dbf
new file mode 100644
index 0000000000..ce313b02de
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1250.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.prj b/msautotest/misc/data/shp_encoding/encoding_1250.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1250.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.shp b/msautotest/misc/data/shp_encoding/encoding_1250.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1250.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.shx b/msautotest/misc/data/shp_encoding/encoding_1250.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1250.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.cpg b/msautotest/misc/data/shp_encoding/encoding_1251.cpg
new file mode 100644
index 0000000000..f0acbc2e3f
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1251.cpg
@@ -0,0 +1 @@
+1251
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.dbf b/msautotest/misc/data/shp_encoding/encoding_1251.dbf
new file mode 100644
index 0000000000..911b826cd0
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1251.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.prj b/msautotest/misc/data/shp_encoding/encoding_1251.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1251.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.shp b/msautotest/misc/data/shp_encoding/encoding_1251.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1251.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.shx b/msautotest/misc/data/shp_encoding/encoding_1251.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1251.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.cpg b/msautotest/misc/data/shp_encoding/encoding_1253.cpg
new file mode 100644
index 0000000000..b0a0271f9c
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1253.cpg
@@ -0,0 +1 @@
+1253
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.dbf b/msautotest/misc/data/shp_encoding/encoding_1253.dbf
new file mode 100644
index 0000000000..58c1e1e45b
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1253.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.prj b/msautotest/misc/data/shp_encoding/encoding_1253.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1253.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.shp b/msautotest/misc/data/shp_encoding/encoding_1253.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1253.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.shx b/msautotest/misc/data/shp_encoding/encoding_1253.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1253.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.cpg b/msautotest/misc/data/shp_encoding/encoding_1254.cpg
new file mode 100644
index 0000000000..c789257680
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1254.cpg
@@ -0,0 +1 @@
+1254
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.dbf b/msautotest/misc/data/shp_encoding/encoding_1254.dbf
new file mode 100644
index 0000000000..d1fce52db5
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1254.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.prj b/msautotest/misc/data/shp_encoding/encoding_1254.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_1254.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.shp b/msautotest/misc/data/shp_encoding/encoding_1254.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1254.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.shx b/msautotest/misc/data/shp_encoding/encoding_1254.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1254.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_437.cpg b/msautotest/misc/data/shp_encoding/encoding_437.cpg
new file mode 100644
index 0000000000..3fa694f245
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_437.cpg
@@ -0,0 +1 @@
+437
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_437.dbf b/msautotest/misc/data/shp_encoding/encoding_437.dbf
new file mode 100644
index 0000000000..570d91df95
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_437.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_437.prj b/msautotest/misc/data/shp_encoding/encoding_437.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_437.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_437.shp b/msautotest/misc/data/shp_encoding/encoding_437.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_437.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_437.shx b/msautotest/misc/data/shp_encoding/encoding_437.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_437.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.cpg b/msautotest/misc/data/shp_encoding/encoding_88591.cpg
new file mode 100644
index 0000000000..0968566aaf
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88591.cpg
@@ -0,0 +1 @@
+88591
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.dbf b/msautotest/misc/data/shp_encoding/encoding_88591.dbf
new file mode 100644
index 0000000000..1beb2035e6
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88591.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.prj b/msautotest/misc/data/shp_encoding/encoding_88591.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88591.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.shp b/msautotest/misc/data/shp_encoding/encoding_88591.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88591.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.shx b/msautotest/misc/data/shp_encoding/encoding_88591.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88591.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.cpg b/msautotest/misc/data/shp_encoding/encoding_885910.cpg
new file mode 100644
index 0000000000..9378e6a30d
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885910.cpg
@@ -0,0 +1 @@
+885910
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.dbf b/msautotest/misc/data/shp_encoding/encoding_885910.dbf
new file mode 100644
index 0000000000..8c1fde3277
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885910.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.prj b/msautotest/misc/data/shp_encoding/encoding_885910.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885910.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.shp b/msautotest/misc/data/shp_encoding/encoding_885910.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885910.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.shx b/msautotest/misc/data/shp_encoding/encoding_885910.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885910.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.cpg b/msautotest/misc/data/shp_encoding/encoding_885911.cpg
new file mode 100644
index 0000000000..8915cc18e4
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885911.cpg
@@ -0,0 +1 @@
+885911
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.dbf b/msautotest/misc/data/shp_encoding/encoding_885911.dbf
new file mode 100644
index 0000000000..759c303989
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885911.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.prj b/msautotest/misc/data/shp_encoding/encoding_885911.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885911.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.shp b/msautotest/misc/data/shp_encoding/encoding_885911.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885911.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.shx b/msautotest/misc/data/shp_encoding/encoding_885911.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885911.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.cpg b/msautotest/misc/data/shp_encoding/encoding_885913.cpg
new file mode 100644
index 0000000000..0d8ed6ba29
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885913.cpg
@@ -0,0 +1 @@
+885913
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.dbf b/msautotest/misc/data/shp_encoding/encoding_885913.dbf
new file mode 100644
index 0000000000..08d8ebb089
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885913.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.prj b/msautotest/misc/data/shp_encoding/encoding_885913.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885913.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.shp b/msautotest/misc/data/shp_encoding/encoding_885913.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885913.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.shx b/msautotest/misc/data/shp_encoding/encoding_885913.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885913.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.cpg b/msautotest/misc/data/shp_encoding/encoding_885915.cpg
new file mode 100644
index 0000000000..ccdb223253
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885915.cpg
@@ -0,0 +1 @@
+885915
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.dbf b/msautotest/misc/data/shp_encoding/encoding_885915.dbf
new file mode 100644
index 0000000000..3372c76dda
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885915.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.prj b/msautotest/misc/data/shp_encoding/encoding_885915.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_885915.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.shp b/msautotest/misc/data/shp_encoding/encoding_885915.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885915.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.shx b/msautotest/misc/data/shp_encoding/encoding_885915.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885915.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.cpg b/msautotest/misc/data/shp_encoding/encoding_88592.cpg
new file mode 100644
index 0000000000..bda94ad63f
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88592.cpg
@@ -0,0 +1 @@
+88592
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.dbf b/msautotest/misc/data/shp_encoding/encoding_88592.dbf
new file mode 100644
index 0000000000..daeba2a73f
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88592.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.prj b/msautotest/misc/data/shp_encoding/encoding_88592.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88592.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.shp b/msautotest/misc/data/shp_encoding/encoding_88592.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88592.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.shx b/msautotest/misc/data/shp_encoding/encoding_88592.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88592.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.cpg b/msautotest/misc/data/shp_encoding/encoding_88593.cpg
new file mode 100644
index 0000000000..c5d61bb5db
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88593.cpg
@@ -0,0 +1 @@
+88593
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.dbf b/msautotest/misc/data/shp_encoding/encoding_88593.dbf
new file mode 100644
index 0000000000..34ae9522ff
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88593.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.prj b/msautotest/misc/data/shp_encoding/encoding_88593.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88593.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.shp b/msautotest/misc/data/shp_encoding/encoding_88593.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88593.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.shx b/msautotest/misc/data/shp_encoding/encoding_88593.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88593.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.cpg b/msautotest/misc/data/shp_encoding/encoding_88594.cpg
new file mode 100644
index 0000000000..355a1b7313
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88594.cpg
@@ -0,0 +1 @@
+88594
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.dbf b/msautotest/misc/data/shp_encoding/encoding_88594.dbf
new file mode 100644
index 0000000000..a4d4d8410f
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88594.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.prj b/msautotest/misc/data/shp_encoding/encoding_88594.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88594.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.shp b/msautotest/misc/data/shp_encoding/encoding_88594.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88594.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.shx b/msautotest/misc/data/shp_encoding/encoding_88594.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88594.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.cpg b/msautotest/misc/data/shp_encoding/encoding_88595.cpg
new file mode 100644
index 0000000000..505ed08eb8
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88595.cpg
@@ -0,0 +1 @@
+88595
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.dbf b/msautotest/misc/data/shp_encoding/encoding_88595.dbf
new file mode 100644
index 0000000000..803ebe61f9
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88595.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.prj b/msautotest/misc/data/shp_encoding/encoding_88595.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88595.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.shp b/msautotest/misc/data/shp_encoding/encoding_88595.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88595.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.shx b/msautotest/misc/data/shp_encoding/encoding_88595.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88595.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.cpg b/msautotest/misc/data/shp_encoding/encoding_88596.cpg
new file mode 100644
index 0000000000..4ee2725f57
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88596.cpg
@@ -0,0 +1 @@
+88596
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.dbf b/msautotest/misc/data/shp_encoding/encoding_88596.dbf
new file mode 100644
index 0000000000..d4ffa1c4fb
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88596.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.prj b/msautotest/misc/data/shp_encoding/encoding_88596.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88596.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.shp b/msautotest/misc/data/shp_encoding/encoding_88596.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88596.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.shx b/msautotest/misc/data/shp_encoding/encoding_88596.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88596.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.cpg b/msautotest/misc/data/shp_encoding/encoding_88597.cpg
new file mode 100644
index 0000000000..ca3fcf9135
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88597.cpg
@@ -0,0 +1 @@
+88597
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.dbf b/msautotest/misc/data/shp_encoding/encoding_88597.dbf
new file mode 100644
index 0000000000..165da9f5f2
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88597.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.prj b/msautotest/misc/data/shp_encoding/encoding_88597.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88597.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.shp b/msautotest/misc/data/shp_encoding/encoding_88597.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88597.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.shx b/msautotest/misc/data/shp_encoding/encoding_88597.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88597.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.cpg b/msautotest/misc/data/shp_encoding/encoding_88598.cpg
new file mode 100644
index 0000000000..231eb307c1
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88598.cpg
@@ -0,0 +1 @@
+88598
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.dbf b/msautotest/misc/data/shp_encoding/encoding_88598.dbf
new file mode 100644
index 0000000000..fd4d9360f5
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88598.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.prj b/msautotest/misc/data/shp_encoding/encoding_88598.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88598.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.shp b/msautotest/misc/data/shp_encoding/encoding_88598.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88598.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.shx b/msautotest/misc/data/shp_encoding/encoding_88598.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88598.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.cpg b/msautotest/misc/data/shp_encoding/encoding_88599.cpg
new file mode 100644
index 0000000000..85bd649b33
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88599.cpg
@@ -0,0 +1 @@
+88599
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.dbf b/msautotest/misc/data/shp_encoding/encoding_88599.dbf
new file mode 100644
index 0000000000..cfa42521cc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88599.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.prj b/msautotest/misc/data/shp_encoding/encoding_88599.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encoding_88599.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.shp b/msautotest/misc/data/shp_encoding/encoding_88599.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88599.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.shx b/msautotest/misc/data/shp_encoding/encoding_88599.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88599.shx differ
diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg b/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg
new file mode 100644
index 0000000000..3ad133c048
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg
@@ -0,0 +1 @@
+UTF-8
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf b/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf
new file mode 100644
index 0000000000..cc401e2433
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf differ
diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.prj b/msautotest/misc/data/shp_encoding/encodings_utf-8.prj
new file mode 100644
index 0000000000..f45cbadf00
--- /dev/null
+++ b/msautotest/misc/data/shp_encoding/encodings_utf-8.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
\ No newline at end of file
diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.shp b/msautotest/misc/data/shp_encoding/encodings_utf-8.shp
new file mode 100644
index 0000000000..eeb7144dbc
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encodings_utf-8.shp differ
diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.shx b/msautotest/misc/data/shp_encoding/encodings_utf-8.shx
new file mode 100644
index 0000000000..d4436d5bef
Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encodings_utf-8.shx differ
diff --git a/msautotest/misc/encoding_from_cpg.map b/msautotest/misc/encoding_from_cpg.map
new file mode 100644
index 0000000000..7ba954461f
--- /dev/null
+++ b/msautotest/misc/encoding_from_cpg.map
@@ -0,0 +1,478 @@
+# Test reading encodings from cpg.
+# http://www.madore.org/~david/computers/unicode/cstab.HTML
+#
+# RUN_PARMS: shp_encodings.png [MAP2IMG] -m [MAPFILE] -o [RESULT]
+#
+# Recipe to generate the files from the 'encodings_utf-8.shp':
+#
+# encodings=(88591 88592 88593 88594 88595 88596 88597 88598 88599 885910 885911 885913 885915 437 1250 1251 1253 1254)
+#
+# for ENC in "${encodings[@]}"; do
+# ogr2ogr -f "ESRI Shapefile" "encoding_${ENC}.shp" "encodings_utf-8.shp" -lco ENCODING="$ENC"
+# done
+#
+map
+ name "test encoding"
+ size 300 300
+ extent -30 -30 40 40
+ web
+ metadata
+ "ows_enable_request" "*"
+ "ows_srs" "epsg:4326"
+ "ows_onlineresource" "http://foo"
+ end
+ end
+ projection
+ "+init=epsg:4326"
+ end
+
+ imagetype png
+
+ symbol
+ type ellipse
+ name "circle"
+ points 1 1 end
+ filled true
+ end
+
+ LAYER
+ NAME "latin-1"
+ DATA "data/shp_encoding/encoding_88591.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "latin-2"
+ DATA "data/shp_encoding/encoding_88592.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "Ą˘Ł¤ĽŚ§¨ŠŞŤŹŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-3"
+ DATA "data/shp_encoding/encoding_88593.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ÄĊĈÇÈÉÊËÌÍÎÏÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâäċĉçèéêëìíîïñòóôġö÷ĝùúûüŭŝ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-4"
+ DATA "data/shp_encoding/encoding_88594.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-5"
+ DATA "data/shp_encoding/encoding_88595.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-6"
+ DATA "data/shp_encoding/encoding_88596.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوى"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-7"
+ DATA "data/shp_encoding/encoding_88597.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-8"
+ DATA "data/shp_encoding/encoding_88598.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "אבגדהוזחטיךכלםמןנסעףפץצקרשת"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-9"
+ DATA "data/shp_encoding/encoding_88599.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-10"
+ DATA "data/shp_encoding/encoding_885910.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ĄĒĢĪĨͧĻĐŠŦŽŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+
+ LAYER
+ NAME "latin-11"
+ DATA "data/shp_encoding/encoding_885911.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัำิีึืฺุู"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "latin-13"
+ DATA "data/shp_encoding/encoding_885913.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "latin-15"
+ DATA "data/shp_encoding/encoding_885915.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "ANSI 1250"
+ DATA "data/shp_encoding/encoding_1250.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüý"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+ LAYER
+ NAME "ANSI 1251"
+ DATA "data/shp_encoding/encoding_1251.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзиклмнопрстуфхцчшщъыьэюя"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "ANSI 1253"
+ DATA "data/shp_encoding/encoding_1253.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "ANSI 1254"
+ DATA "data/shp_encoding/encoding_1254.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖØÙÚÛÜİŞß"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+ LAYER
+ NAME "OEM Codepage 437"
+ DATA "data/shp_encoding/encoding_437.shp"
+ TYPE point
+ CLASSITEM "data"
+ LABELITEM "encoding"
+ STATUS on
+ CLASS
+ EXPRESSION "ÉæÆôöòûùÿÖÜ¢£¥₧ƒ"
+ STYLE
+ SYMBOL "circle"
+ SIZE 8
+ COLOR 255 0 0
+ END # STYLE
+ LABEL
+ SIZE 6
+ COLOR 0 0 0
+ POSITION AUTO
+ PARTIALS TRUE
+ MAXLENGTH 10
+ END # LABEL
+ END # CLASS
+ END # LAYER
+
+END # MAP
diff --git a/msautotest/misc/expected/scaletoken_filterexpression_192k.png b/msautotest/misc/expected/scaletoken_filterexpression_192k.png
new file mode 100644
index 0000000000..5ec2916013
Binary files /dev/null and b/msautotest/misc/expected/scaletoken_filterexpression_192k.png differ
diff --git a/msautotest/misc/expected/scaletoken_filterexpression_424k.png b/msautotest/misc/expected/scaletoken_filterexpression_424k.png
new file mode 100644
index 0000000000..72dbbe9bf2
Binary files /dev/null and b/msautotest/misc/expected/scaletoken_filterexpression_424k.png differ
diff --git a/msautotest/misc/expected/shp_encodings.png b/msautotest/misc/expected/shp_encodings.png
new file mode 100644
index 0000000000..364283169f
Binary files /dev/null and b/msautotest/misc/expected/shp_encodings.png differ
diff --git a/msautotest/misc/scaletoken.map b/msautotest/misc/scaletoken.map
index d98c2c6f15..380a9780f1 100644
--- a/msautotest/misc/scaletoken.map
+++ b/msautotest/misc/scaletoken.map
@@ -8,6 +8,8 @@
# RUN_PARMS: scaletoken_filter_655k.png [MAP2IMG] -l layer2 -m [MAPFILE] -o [RESULT] -e 474315 4762880 485645 4765610
# RUN_PARMS: scaletoken_filteritem_192k.png [MAP2IMG] -l layer3 -m [MAPFILE] -o [RESULT] -e 478315 4762880 481645 4765610
# RUN_PARMS: scaletoken_filteritem_424k.png [MAP2IMG] -l layer3 -m [MAPFILE] -o [RESULT] -e 476315 4762880 483645 4765610
+# RUN_PARMS: scaletoken_filterexpression_192k.png [MAP2IMG] -l layer4 -m [MAPFILE] -o [RESULT] -e 478315 4762880 481645 4765610
+# RUN_PARMS: scaletoken_filterexpression_424k.png [MAP2IMG] -l layer4 -m [MAPFILE] -o [RESULT] -e 476315 4762880 483645 4765610
#
MAP
NAME 'scaletoken'
@@ -83,5 +85,24 @@ MAP
STYLE COLOR 51 51 51 END
END
END
+ LAYER
+ NAME 'layer4'
+ STATUS ON
+ DEBUG 1
+ DATA "data/shppoly/poly.shp"
+ SCALETOKEN
+ NAME "%filter%"
+ VALUES
+ "0" "158"
+ "200000" "166"
+ END
+ END
+ # FILTER using an expression
+ FILTER ([EAS_ID] = %filter% )
+ TYPE POLYGON
+ CLASS
+ STYLE COLOR 51 51 51 END
+ END
+ END
END
diff --git a/msautotest/mspython/test_wms_client.py b/msautotest/mspython/test_wms_client.py
new file mode 100644
index 0000000000..caf9f9c16b
--- /dev/null
+++ b/msautotest/mspython/test_wms_client.py
@@ -0,0 +1,55 @@
+import os
+
+import pytest
+
+mapscript_available = False
+try:
+ import mapscript
+
+ mapscript_available = True
+except ImportError:
+ pass
+
+pytestmark = [
+ pytest.mark.skipif(not mapscript_available, reason="mapscript not available"),
+ pytest.mark.skipif(
+ "SUPPORTS=WMS_CLIENT" not in mapscript.msGetVersion(),
+ reason="WMS Client is not enabled",
+ ),
+]
+
+
+def get_relpath_to_this(filename):
+ return os.path.join(os.path.dirname(__file__), filename)
+
+
+###############################################################################
+# Test that WMS client GetMap request does not modify layer extent or projection
+
+
+def test_wms_client_does_not_modify_layer():
+ map = mapscript.mapObj(get_relpath_to_this("wms_client.map"))
+
+ layerObj = map.getLayer(0)
+ assert layerObj.getExtent().minx == -180
+ assert layerObj.getExtent().miny == -90
+ assert layerObj.getExtent().maxx == 180
+ assert layerObj.getExtent().maxy == 90
+ assert layerObj.getProjection() == "+init=epsg:4326"
+
+ # Do a GetMap request in EPSG:32633
+ request = mapscript.OWSRequest()
+ mapscript.msIO_installStdoutToBuffer()
+ request.loadParamsFromURL(
+ "&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616"
+ )
+ status = map.OWSDispatch(request)
+
+ assert status == 0
+
+ # Assert that layer extent and projection is not modified
+ assert layerObj.getExtent().minx == -180
+ assert layerObj.getExtent().miny == -90
+ assert layerObj.getExtent().maxx == 180
+ assert layerObj.getExtent().maxy == 90
+ assert layerObj.getProjection() == "+init=epsg:4326"
diff --git a/msautotest/mspython/wms_client.map b/msautotest/mspython/wms_client.map
new file mode 100644
index 0000000000..37c86ae36a
--- /dev/null
+++ b/msautotest/mspython/wms_client.map
@@ -0,0 +1,51 @@
+
+
+MAP
+ NAME WMS_CLIENT_TEST_130
+ STATUS ON
+ SIZE 400 300
+ EXTENT -180 -90 180 90
+ UNITS DD
+ PROJECTION
+ "init=epsg:4326"
+ END
+ IMAGECOLOR 255 255 255
+ #SYMBOLSET etc/symbols.sym
+ #FONTSET etc/fonts.txt
+
+ RESOLUTION 96
+ IMAGETYPE png24
+
+ WEB
+ IMAGEPATH "/tmp/ms_tmp/"
+ IMAGEURL "/ms_tmp/"
+ METADATA
+ "ows_updatesequence" "123"
+ "wms_title" "Test WMS 1.3.0 client"
+ "wms_srs" "EPSG:4326"
+ "ows_enable_request" "*"
+ "wms_getmap_formatlist" "image/png,image/png; mode=24bit"
+ "ows_onlineresource" "http://localhost/wmsclient?"
+ END
+ END
+
+ LAYER
+ NAME client
+ TYPE RASTER
+ STATUS ON
+ CONNECTION "https://demo.mapserver.org/cgi-bin/wms?"
+ CONNECTIONTYPE WMS
+ TEMPLATE "dummy"
+ EXTENT -180 -90 180 90
+ METADATA
+ "wms_srs" "EPSG:4326 EPSG:32633"
+ "wms_name" "cities"
+ "wms_server_version" "1.3.0"
+ "wms_format" "image/png"
+ "wms_enable_request" "*"
+ END
+ PROJECTION
+ "init=epsg:4326"
+ END
+ END
+END
diff --git a/msautotest/pymod/msautotest_viewer.py b/msautotest/pymod/msautotest_viewer.py
index 77c1e2806c..87cf00fed0 100755
--- a/msautotest/pymod/msautotest_viewer.py
+++ b/msautotest/pymod/msautotest_viewer.py
@@ -21,7 +21,6 @@
def main():
function_name = "main: "
- global config, logging_flag
if not os.path.isdir(os.path.dirname(python_logging_file)):
print("Content-type: text/html")
@@ -444,7 +443,6 @@ def main():
## browser
def tiff2png(tiff_file):
function_name = "tiff2png: "
- global python_logging_file, logging_flag, config
## Checking if path is found
if not os.path.isdir(os.path.dirname(python_logging_file)):
@@ -603,7 +601,6 @@ def tiff2png(tiff_file):
## Remove temporary PNG images file
def rmTmpPngImages():
- global config
function_name = "rmTmpPngImages: "
tmp_path = config.get("Applications", "TmpDir")
diff --git a/msautotest/pymod/mstestlib.py b/msautotest/pymod/mstestlib.py
index bf8b8f50b0..ea8b0ecc0e 100644
--- a/msautotest/pymod/mstestlib.py
+++ b/msautotest/pymod/mstestlib.py
@@ -486,13 +486,18 @@ def get_gdal_version():
except Exception:
gdal_version = os.popen("gdalinfo --version").read()
- # Parse something like "GDAL x.y.zdev, released..." to extract "x.y.z"
+ # Parse GDAL version formats to extract "x.y.z" e.g.
+ # 'GDAL x.y.zdev'
+ # 'GDAL 3.11.3 "Eganville", released 2025/07/12'
+ # 'GDAL 3.11.3 Eganville'
+ # 'GDAL 3.x.y, released'
if gdal_version.startswith("GDAL "):
gdal_version = gdal_version[len("GDAL ") :]
- pos = gdal_version.find("dev")
- if pos >= 0:
- return gdal_version[0:pos]
- pos = gdal_version.find(",")
+ dev_pos = gdal_version.find("dev")
+ comma_pos = gdal_version.find(",")
+ space_pos = gdal_version.find(" ")
+ positions = [p for p in (dev_pos, comma_pos, space_pos) if p != -1]
+ pos = min(positions) if positions else -1
if pos >= 0:
return gdal_version[0:pos]
return None
diff --git a/msautotest/query/context.map b/msautotest/query/context.map
index 3cc1c8a988..ae67ba9982 100644
--- a/msautotest/query/context.map
+++ b/msautotest/query/context.map
@@ -6,6 +6,8 @@
# RUN_PARMS: context_test001.png [MAP2IMG] -m [MAPFILE] -l "bdry_counpy2" -o [RESULT]
# RUN_PARMS: context_test002.png [MAP2IMG] -m [MAPFILE] -l "bdry_counpy2 indx_q100kpy4" -o [RESULT]
# RUN_PARMS: context_test003.png [MAP2IMG] -m [MAPFILE] -l "indx_q100kpy4" -o [RESULT]
+# RUN_PARMS: context_test004.png [MAP2IMG] -m [MAPFILE] -l "req_fail" -o [RESULT]
+# RUN_PARMS: context_test005.png [MAP2IMG] -m [MAPFILE] -l "lreq_fail" -o [RESULT]
#
MAP
NAME 'context'
@@ -25,4 +27,16 @@ MAP
REQUIRES '![bdry_counpy2]'
INCLUDE 'include/indx_q100kpy4_shapefile.map'
END
+
+ LAYER
+ NAME 'req_fail'
+ REQUIRES '[non_existant]'
+ INCLUDE 'include/bdry_counpy2_shapefile.map'
+ END
+
+ LAYER
+ NAME 'lreq_fail'
+ LABELREQUIRES '[non_existant]'
+ INCLUDE 'include/bdry_counpy2_shapefile.map'
+ END
END
diff --git a/msautotest/query/expected/context_test004.png b/msautotest/query/expected/context_test004.png
new file mode 100644
index 0000000000..0f51863b07
Binary files /dev/null and b/msautotest/query/expected/context_test004.png differ
diff --git a/msautotest/query/expected/context_test005.png b/msautotest/query/expected/context_test005.png
new file mode 100644
index 0000000000..cf36e3b14c
Binary files /dev/null and b/msautotest/query/expected/context_test005.png differ
diff --git a/msautotest/requirements.txt b/msautotest/requirements.txt
index b9e37ff1fe..eaa83d0dee 100644
--- a/msautotest/requirements.txt
+++ b/msautotest/requirements.txt
@@ -1,10 +1,4 @@
-# Python 2.7 constraints
-# more-itertools 6.0 no longer supporting Python 2.7
-more-itertools < 6.0.0; python_version < '3.0'
-# pytest 5.0 no longer supporting Python 2.7
-pytest>=3.6.0,<5.0.0; python_version < '3.0'
-
-pytest>=3.6.0; python_version >= '3.0'
+pytest
pytest-sugar
pytest-env
lxml
diff --git a/msautotest/wxs/data/weird_column_names.csv b/msautotest/wxs/data/weird_column_names.csv
new file mode 100644
index 0000000000..edfcac5d1a
--- /dev/null
+++ b/msautotest/wxs/data/weird_column_names.csv
@@ -0,0 +1,3 @@
+"]","a""b",WKT
+1,foo,"POINT (1000000 4000000)"
+2,bar,"POINT (1000000 4000000)"
diff --git a/msautotest/wxs/data/weird_column_names.csvt b/msautotest/wxs/data/weird_column_names.csvt
new file mode 100644
index 0000000000..0322d0cf5b
--- /dev/null
+++ b/msautotest/wxs/data/weird_column_names.csvt
@@ -0,0 +1 @@
+Integer,String,WKT
diff --git a/msautotest/wxs/data/weird_column_names.db b/msautotest/wxs/data/weird_column_names.db
new file mode 100644
index 0000000000..e700280462
Binary files /dev/null and b/msautotest/wxs/data/weird_column_names.db differ
diff --git a/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml b/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml
new file mode 100644
index 0000000000..eb76eeeb0d
--- /dev/null
+++ b/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml
@@ -0,0 +1,12 @@
+Content-Type: text/xml; subtype="gml/3.2.1"; charset=UTF-8
+
+
+
+
+
diff --git a/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml b/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml
index 23f115a9cf..35c7fe0834 100644
--- a/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml
+++ b/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml
@@ -3,6 +3,6 @@ Content-Type: text/html
MapServer Message
-loadOutputFormat(): General error message. OUTPUTFORMAT (nocreatedatasource) clause references driver (OGR/SDTS), but this driver isn't configured.
-msInitDefaultOGROutputFormat(): General error message. OGR `SDTS' driver does not support output.
+loadOutputFormat(): General error message. OUTPUTFORMAT (nocreatedatasource) clause references driver (OGR/SXF), but this driver isn't configured.
+msInitDefaultOGROutputFormat(): General error message. OGR `SXF' driver does not support output.
\ No newline at end of file
diff --git a/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml b/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml
new file mode 100644
index 0000000000..4907bb2c37
--- /dev/null
+++ b/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml
@@ -0,0 +1,8 @@
+Content-Type: text/xml; charset=UTF-8
+
+
+
+
+msWFSGetFeature(): WFS server error. Invalid or Unsupported FILTER in GetFeature : <Filter><PropertyIsEqualTo matchCase=false><PropertyName>
+
+
diff --git a/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml
new file mode 100644
index 0000000000..a5fdf00f11
--- /dev/null
+++ b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml
@@ -0,0 +1,37 @@
+Content-Type: text/xml; charset=UTF-8
+
+
+
+
+
+ 1000000.000000,4000000.000000 1000000.000000,4000000.000000
+
+
+
+
+
+
+
+ 1000000.000000,4000000.000000 1000000.000000,4000000.000000
+
+
+
+
+ 1000000.000000,4000000.000000
+
+
+
+ 1
+
+ foo
+
+
+
+
diff --git a/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml
new file mode 100644
index 0000000000..a5fdf00f11
--- /dev/null
+++ b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml
@@ -0,0 +1,37 @@
+Content-Type: text/xml; charset=UTF-8
+
+
+
+
+
+ 1000000.000000,4000000.000000 1000000.000000,4000000.000000
+
+
+
+
+
+
+
+ 1000000.000000,4000000.000000 1000000.000000,4000000.000000
+
+
+
+
+ 1000000.000000,4000000.000000
+
+
+
+ 1
+
+ foo
+
+
+
+
diff --git a/msautotest/wxs/expected/wms_client_style_remote_exception.png b/msautotest/wxs/expected/wms_client_style_remote_exception.png
new file mode 100644
index 0000000000..fb1d11d86f
Binary files /dev/null and b/msautotest/wxs/expected/wms_client_style_remote_exception.png differ
diff --git a/msautotest/wxs/expected/wms_client_undefined_style_exception.xml b/msautotest/wxs/expected/wms_client_undefined_style_exception.xml
new file mode 100644
index 0000000000..4a94e01b15
--- /dev/null
+++ b/msautotest/wxs/expected/wms_client_undefined_style_exception.xml
@@ -0,0 +1,6 @@
+
+
+
+msWMSLoadGetMapParams(): WMS server error. Style (undefined_style) not defined on layer.
+
+
diff --git a/msautotest/wxs/expected/wms_custom_projection_not_specified.xml b/msautotest/wxs/expected/wms_custom_projection_not_specified.xml
index 9ba9744f9e..c542496cb3 100644
--- a/msautotest/wxs/expected/wms_custom_projection_not_specified.xml
+++ b/msautotest/wxs/expected/wms_custom_projection_not_specified.xml
@@ -2,6 +2,6 @@
msWMSLoadGetMapParams(): WMS server error. Invalid CRS given : CRS must be valid for all requested layers.
-msProcessProjection(): Projection library error. proj error "Invalid value for an argument" for "init=esri:54009"
+msProcessProjection(): Projection library error. PROJ error "Invalid value for an argument" when instantiating "init=esri:54009"
diff --git a/msautotest/wxs/expected/wms_gradient_legend.png b/msautotest/wxs/expected/wms_gradient_legend.png
new file mode 100644
index 0000000000..11944bc9d6
Binary files /dev/null and b/msautotest/wxs/expected/wms_gradient_legend.png differ
diff --git a/msautotest/wxs/wfs_200_cite_postgis.map b/msautotest/wxs/wfs_200_cite_postgis.map
index af180e424e..ce1469a1c6 100644
--- a/msautotest/wxs/wfs_200_cite_postgis.map
+++ b/msautotest/wxs/wfs_200_cite_postgis.map
@@ -16,6 +16,7 @@
# RUN_PARMS: wfs_200_cite_postgis_propertyisnil_nillable_property.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typenames=province&filter=NomFrancais" > [RESULT_DEVERSION]
# RUN_PARMS: wfs_200_cite_postgis_not_propertyisnil_nillable_property.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typenames=province&filter=NomFrancais" > [RESULT_DEVERSION]
# RUN_PARMS: wfs_200_cite_postgis_filter_resourceid_stringvalue.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=" > [RESULT_DEVERSION]
+# RUN_PARMS: wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=" > [RESULT_DEVERSION]
# RUN_PARMS: wfs_200_cite_postgis_filter_like.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=island_e*" > [RESULT_DEVERSION]
MAP
diff --git a/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map b/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map
index 3b1f9b8758..08035e3531 100644
--- a/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map
+++ b/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map
@@ -12,7 +12,7 @@ MAP
OUTPUTFORMAT
NAME "nocreatedatasource"
- DRIVER "OGR/SDTS"
+ DRIVER "OGR/SXF"
MIMETYPE "text/nocreatedatasource"
END
diff --git a/msautotest/wxs/wfs_ogr_native_sql.map b/msautotest/wxs/wfs_ogr_native_sql.map
index 2245e23ec7..0c349be172 100644
--- a/msautotest/wxs/wfs_ogr_native_sql.map
+++ b/msautotest/wxs/wfs_ogr_native_sql.map
@@ -21,6 +21,8 @@
# RUN_PARMS: wfs_ogr_native_sql_05.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT]
# RUN_PARMS: wfs_ogr_native_sql_06.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT]
+# RUN_PARMS: wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=" OR 1=1 OR 1="fanano" > [RESULT]
+
# RUN_PARMS: wfs_ogr_native_sql_06_disable_default_extent_for_getfeature.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT]
# RUN_PARMS: wfs_ogr_native_sql_07.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT]
@@ -98,6 +100,9 @@
# RUN_PARMS: wfs_ogr_native_sql_42.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&COUNT=1" > [RESULT_DEVERSION]
# RUN_PARMS: wfs_ogr_native_sql_43.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&COUNT=1&SRSNAME=EPSG:4326" > [RESULT_DEVERSION]
+# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_numeric.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=]1" > [RESULT]
+# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_string.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=a%26quot;bfoo" > [RESULT]
+
MAP
NAME WFS_OGR_NATIVE_SQL_TEST
@@ -358,4 +363,26 @@ LAYER
TEMPLATE "wfs_ogr_native_sql.map"
END # Layer
+LAYER
+
+ NAME weird_column_names
+ CONNECTIONTYPE OGR
+ CONNECTION "./data/weird_column_names.db"
+ PROCESSING "NATIVE_SQL=YES"
+ METADATA
+ "ows_title" "weird_column_names"
+ "wfs_featureid" "ID"
+ "gml_include_items" "all"
+ "gml_types" "auto"
+ "wfs_getfeature_formatlist" "ogrgml"
+ END
+ TYPE POINT
+ STATUS ON
+ PROJECTION
+ "init=epsg:32632"
+ END
+
+ TEMPLATE "wfs_ogr_native_sql.map"
+END # Layer
+
END # Map File
diff --git a/msautotest/wxs/wfs_ogr_no_native_sql.map b/msautotest/wxs/wfs_ogr_no_native_sql.map
index 8a8686304b..7a3d4f95e2 100644
--- a/msautotest/wxs/wfs_ogr_no_native_sql.map
+++ b/msautotest/wxs/wfs_ogr_no_native_sql.map
@@ -17,6 +17,9 @@
#
# RUN_PARMS: wfs_ogr_native_sql_05.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT]
# RUN_PARMS: wfs_ogr_native_sql_06.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT]
+
+# RUN_PARMS: wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=" OR 1=1 OR 1="fanano" > [RESULT]
+
# RUN_PARMS: wfs_ogr_native_sql_07.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT]
# RUN_PARMS: wfs_ogr_native_sql_08.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT]
#
@@ -62,6 +65,9 @@
# RUN_PARMS: wfs_ogr_native_sql_31.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=20000Geometry653627 4881103 653174 4890443 663148 4887813 663330 4879471 653627 4881103" > [RESULT]
# RUN_PARMS: wfs_ogr_native_sql_32.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=1000Geometry653627 4881103 653174 4890443 663148 4887813 663330 4879471 653627 4881103" > [RESULT]
+# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_numeric.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=]1" > [RESULT]
+# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_string.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=a%26quot;bfoo" > [RESULT]
+
MAP
NAME WFS_OGR_NATIVE_SQL_TEST
@@ -119,4 +125,26 @@ LAYER
TEMPLATE "wfs_ogr_native_sql.map"
END # Layer
+LAYER
+
+ NAME weird_column_names
+ CONNECTIONTYPE OGR
+ CONNECTION "./data/weird_column_names.db"
+ PROCESSING "NATIVE_SQL=NO"
+ METADATA
+ "ows_title" "weird_column_names"
+ "wfs_featureid" "ID"
+ "gml_include_items" "all"
+ "gml_types" "auto"
+ "wfs_getfeature_formatlist" "ogrgml"
+ END
+ TYPE POINT
+ STATUS ON
+ PROJECTION
+ "init=epsg:32632"
+ END
+
+ TEMPLATE "wfs_ogr_native_sql.map"
+END # Layer
+
END # Map File
diff --git a/msautotest/wxs/wms_client_111.map b/msautotest/wxs/wms_client_111.map
index 07ff8a7992..1e166fe0ff 100644
--- a/msautotest/wxs/wms_client_111.map
+++ b/msautotest/wxs/wms_client_111.map
@@ -5,11 +5,15 @@
#
#
# GetMap
+# RUN_PARMS: wms_client_111.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME]
# RUN_PARMS: wms_client_111.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME]
#
# GetFeatureInfo
+# RUN_PARMS: wms_client_111.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
# RUN_PARMS: wms_client_111.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
+#
# GetLegendGraphic
+# RUN_PARMS: wms_client_111_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME]
# RUN_PARMS: wms_client_111_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png" > [RESULT_DEMIME]
diff --git a/msautotest/wxs/wms_client_111_axis_fail.map b/msautotest/wxs/wms_client_111_axis_fail.map
index cf28943428..2cffb085b0 100644
--- a/msautotest/wxs/wms_client_111_axis_fail.map
+++ b/msautotest/wxs/wms_client_111_axis_fail.map
@@ -5,9 +5,11 @@
#
#
# GetMap
+# RUN_PARMS: wms_client_111_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME]
# RUN_PARMS: wms_client_111_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME]
#
# GetFeatureInfo
+# RUN_PARMS: wms_client_111_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
# RUN_PARMS: wms_client_111_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
diff --git a/msautotest/wxs/wms_client_130.map b/msautotest/wxs/wms_client_130.map
index 1238c33c12..1a86eb32e0 100644
--- a/msautotest/wxs/wms_client_130.map
+++ b/msautotest/wxs/wms_client_130.map
@@ -5,13 +5,24 @@
#
#
# GetMap
+# RUN_PARMS: wms_client_130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME]
# RUN_PARMS: wms_client_130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME]
+#
+# RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME]
# RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME]
#
+# Request with STYLES. Note that the remote server does not publish any styles.
+# RUN_PARMS: wms_client_undefined_style_exception.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=wms_style&STYLES=undefined_style&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME]
+# Tests that the request is valid, but resulting image contains error as 'named_style' is not defined in remote server.
+# RUN_PARMS: wms_client_style_remote_exception.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=wms_style&STYLES=named_style&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME]
+#
# GetFeatureInfo
+# RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
# RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
+#
# GetLegendGraphic
# RUN_PARMS: wms_client_130_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME]
+# RUN_PARMS: wms_client_130_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME]
MAP
@@ -59,4 +70,22 @@ MAP
"wms_enable_request" "*"
END
END
+
+ LAYER
+ NAME wms_style
+ TYPE RASTER
+ STATUS ON
+ CONNECTION "https://demo.mapserver.org/cgi-bin/wms?"
+ CONNECTIONTYPE WMS
+ TEMPLATE "dummy"
+ EXTENT -180 -90 180 90
+ METADATA
+ "wms_srs" "EPSG:4326 EPSG:32633"
+ "wms_name" "cities"
+ "wms_server_version" "1.3.0"
+ "wms_format" "image/png"
+ "wms_enable_request" "*"
+ "wms_style" "named_style"
+ END
+ END
END
diff --git a/msautotest/wxs/wms_client_130_axis_fail.map b/msautotest/wxs/wms_client_130_axis_fail.map
index 8b20f21d2d..e46295c643 100644
--- a/msautotest/wxs/wms_client_130_axis_fail.map
+++ b/msautotest/wxs/wms_client_130_axis_fail.map
@@ -5,9 +5,11 @@
#
#
# GetMap
+# RUN_PARMS: wms_client_130_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME]
# RUN_PARMS: wms_client_130_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME]
-#
+
# GetFeatureInfo
+# RUN_PARMS: wms_client_130_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
# RUN_PARMS: wms_client_130_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT]
diff --git a/msautotest/wxs/wms_legend.map b/msautotest/wxs/wms_legend.map
index 777a7caefa..144b194553 100644
--- a/msautotest/wxs/wms_legend.map
+++ b/msautotest/wxs/wms_legend.map
@@ -21,6 +21,7 @@
# RUN_PARMS: mode_maplegend_74.png [MAPSERV] QUERY_STRING='map=[MAPFILE]&mode=maplegend&mapext=2291338+-73348+2301636+-64058&layer=layer1' > [RESULT_DEMIME]
# RUN_PARMS: wms_legend_notext.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.0&REQUEST=GetLegendGraphic&LAYER=layer3&FORMAT=image/png" > [RESULT_DEMIME]
# RUN_PARMS: wms_keyimage_legend.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.0&REQUEST=GetLegendGraphic&LAYER=layer4&FORMAT=image/png&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME]
+# RUN_PARMS: wms_gradient_legend.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=gradient&SLD_VERSION=1.1.0&FORMAT=image/png&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME]
MAP
@@ -228,4 +229,27 @@ LAYER
END #Class
END # Layer
+LAYER
+ NAME "gradient"
+ DATA multiband.tif
+ METADATA
+ "wms_title" "gradient_opacity"
+ END
+ TYPE RASTER
+ STATUS ON
+
+ CLASSITEM "GRADIENT"
+ CLASS
+ NAME "-250 m to -50 m"
+ GROUP "Blue"
+ EXPRESSION ([pixel] >= -250 AND [pixel] < -50)
+ STYLE
+ OPACITY 70
+ RANGEITEM "pixel"
+ COLORRANGE 128 172 239 7 6 111
+ DATARANGE -250.000000 -50.000000
+ END # STYLE
+ TITLE "-250 m to -50 m"
+ END # CLASS
+END # Layer
END # Map File
diff --git a/msautotest/wxs/wms_raster.map b/msautotest/wxs/wms_raster.map
index dfa30ecbbe..9fd8383a42 100644
--- a/msautotest/wxs/wms_raster.map
+++ b/msautotest/wxs/wms_raster.map
@@ -31,7 +31,7 @@ IMAGECOLOR 255 255 255
SHAPEPATH ./data
SYMBOLSET etc/symbols.sym
FONTSET etc/fonts.txt
-
+DEBUG 1
#
# Start of web interface definition
diff --git a/scripts/vagrant/packages.sh b/scripts/vagrant/packages.sh
index 75afb4c432..39b6c92271 100755
--- a/scripts/vagrant/packages.sh
+++ b/scripts/vagrant/packages.sh
@@ -12,7 +12,7 @@ apt-get -y upgrade
# install packages we need
apt-get install -q -y git build-essential pkg-config cmake libgeos-dev rake \
- libpq-dev python3-dev python3-pip libproj-dev libxml2-dev postgis php-dev \
+ libpq-dev python3-dev python3-pip python3-venv libproj-dev libxml2-dev postgis php-dev \
postgresql-server-dev-12 postgresql-12-postgis-3 postgresql-12-postgis-3-scripts vim bison flex swig \
librsvg2-dev libpng-dev libjpeg-dev libgif-dev \
libfreetype6-dev libfcgi-dev libcurl4-gnutls-dev libcairo2-dev \
diff --git a/src/mapagg.cpp b/src/mapagg.cpp
index 693dca8f93..bf06194002 100644
--- a/src/mapagg.cpp
+++ b/src/mapagg.cpp
@@ -692,8 +692,12 @@ int agg2RenderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol,
} else {
// just copy the image at the correct location (we place the pixmap on
// the nearest integer pixel to avoid blurring)
+ unsigned alpha = mapserver::cover_full;
+ if (style && style->color) {
+ alpha = style->color->alpha;
+ }
r->m_renderer_base.blend_from(pf, 0, MS_NINT(x - pixmap->width / 2.),
- MS_NINT(y - pixmap->height / 2.));
+ MS_NINT(y - pixmap->height / 2.), alpha);
}
return MS_SUCCESS;
}
diff --git a/src/mapdrawgdal.c b/src/mapdrawgdal.c
index e9e5c259b0..6288378285 100644
--- a/src/mapdrawgdal.c
+++ b/src/mapdrawgdal.c
@@ -1191,7 +1191,7 @@ static int ApplyLUT(int iColorIndex, const char *lut_def, const void *pInBuffer,
if (lut_def == NULL) {
if (pInBuffer != pabyOutBuffer) {
- GDALCopyWords((void *)pInBuffer, eDT, GDALGetDataTypeSize(eDT) / 8,
+ GDALCopyWords(pInBuffer, eDT, GDALGetDataTypeSizeBytes(eDT),
pabyOutBuffer, GDT_Byte, 1, nPixelCount);
}
return 0;
@@ -1332,7 +1332,7 @@ static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count,
result_code =
ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex],
(GByte *)pBuffer + dst_xsize * dst_ysize * iColorIndex *
- (GDALGetDataTypeSize(eDT) / 8),
+ GDALGetDataTypeSizeBytes(eDT),
eDT, pabyWholeBuffer + dst_xsize * dst_ysize * iColorIndex,
dst_xsize * dst_ysize);
}
@@ -1824,7 +1824,7 @@ msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image,
/* Allocate buffer, and read data into it. */
/* -------------------------------------------------------------------- */
pBuffer = malloc(((size_t)dst_xsize) * dst_ysize * image->format->bands *
- (GDALGetDataTypeSize(eDataType) / 8));
+ GDALGetDataTypeSizeBytes(eDataType));
if (pBuffer == NULL) {
msSetError(MS_MEMERR, "Allocating work image of size %dx%d failed.",
"msDrawRasterLayerGDAL()", dst_xsize, dst_ysize);
diff --git a/src/maphttp.c b/src/maphttp.c
index ea736d18c4..7c85e7334b 100644
--- a/src/maphttp.c
+++ b/src/maphttp.c
@@ -127,6 +127,7 @@ void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests) {
pasReqInfo[i].pszPostRequest = NULL;
pasReqInfo[i].pszPostContentType = NULL;
pasReqInfo[i].pszOutputFile = NULL;
+ pasReqInfo[i].pszEPSG = NULL;
pasReqInfo[i].nLayerId = 0;
pasReqInfo[i].nTimeout = 0;
pasReqInfo[i].nMaxBytes = 0;
@@ -174,6 +175,10 @@ void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests) {
free(pasReqInfo[i].pszOutputFile);
pasReqInfo[i].pszOutputFile = NULL;
+ if (pasReqInfo[i].pszEPSG)
+ free(pasReqInfo[i].pszEPSG);
+ pasReqInfo[i].pszEPSG = NULL;
+
if (pasReqInfo[i].pszContentType)
free(pasReqInfo[i].pszContentType);
pasReqInfo[i].pszContentType = NULL;
diff --git a/src/maphttp.h b/src/maphttp.h
index 13292a7d4c..b44b7b5eac 100644
--- a/src/maphttp.h
+++ b/src/maphttp.h
@@ -47,6 +47,7 @@ typedef struct http_request_info {
int nLayerId;
char *pszGetUrl;
char *pszOutputFile;
+ char *pszEPSG;
int nTimeout;
int nMaxBytes;
rectObj bbox;
diff --git a/src/maplayer.c b/src/maplayer.c
index 8501f02641..1f6b04fb6f 100644
--- a/src/maplayer.c
+++ b/src/maplayer.c
@@ -105,7 +105,15 @@ int msLayerRestoreFromScaletokens(layerObj *layer) {
layer->tileitem = layer->orig_st->tileitem;
}
if (layer->orig_st->filter) {
- msLoadExpressionString(&(layer->filter), layer->orig_st->filter);
+ if (layer->filter.type == MS_EXPRESSION) {
+ const size_t tmpval_size = strlen(layer->filter.string) + 3;
+ char *tmpval = (char *)msSmallMalloc(tmpval_size);
+ snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string);
+ msLoadExpressionString(&(layer->filter), tmpval);
+ msFree(tmpval);
+ } else {
+ msLoadExpressionString(&(layer->filter), layer->orig_st->filter);
+ }
msFree(layer->orig_st->filter);
}
if (layer->orig_st->filteritem) {
@@ -196,7 +204,6 @@ int msLayerApplyScaletokens(layerObj *layer, double scale) {
msReplaceSubstring(layer->filteritem, st->name, ste->value);
}
if (layer->filter.string && strstr(layer->filter.string, st->name)) {
- char *tmpval;
if (layer->debug >= MS_DEBUGLEVEL_DEBUG) {
msDebug("replacing scaletoken (%s) with (%s) in layer->filter (%s) for "
"scale=%f\n",
@@ -204,11 +211,23 @@ int msLayerApplyScaletokens(layerObj *layer, double scale) {
}
check_st_alloc(layer);
layer->orig_st->filter = msStrdup(layer->filter.string);
- tmpval = msStrdup(layer->filter.string);
+
+ char *tmpval = NULL;
+ if (layer->filter.type == MS_EXPRESSION) {
+ const size_t tmpval_size = strlen(layer->filter.string) + 3;
+ tmpval = (char *)msSmallMalloc(tmpval_size);
+ snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string);
+ } else {
+ tmpval = msStrdup(layer->filter.string);
+ }
+
tmpval = msReplaceSubstring(tmpval, st->name, ste->value);
- if (msLoadExpressionString(&(layer->filter), tmpval) == -1)
+
+ if (msLoadExpressionString(&(layer->filter), tmpval) == -1) {
+ msFree(tmpval);
return (MS_FAILURE); /* msLoadExpressionString() cleans up previously
allocated expression */
+ }
msFree(tmpval);
}
diff --git a/src/maplegend.c b/src/maplegend.c
index e1b49085ff..b8227c32d4 100644
--- a/src/maplegend.c
+++ b/src/maplegend.c
@@ -66,10 +66,15 @@ static int msDrawGradientSymbol(rendererVTableObj *renderer,
b[4 * (j * rb->width + i)] = style->color.blue;
g[4 * (j * rb->width + i)] = style->color.green;
r[4 * (j * rb->width + i)] = style->color.red;
- a[4 * (j * rb->width + i)] = style->color.alpha;
+ if (strncasecmp(image_draw->format->driver, "AGG/", 4) == 0) {
+ a[4 * (j * rb->width + i)] = 255; // Apply alpha later
+ } else {
+ a[4 * (j * rb->width + i)] = style->color.alpha;
+ }
}
}
INIT_SYMBOL_STYLE(symbolStyle);
+ symbolStyle.color = &style->color;
ret = renderer->renderPixmapSymbol(image_draw, x_center, y_center, &symbol,
&symbolStyle);
msFreeSymbol(&symbol);
diff --git a/src/maplexer.c b/src/maplexer.c
index 9fbc84a63a..d3813c561b 100644
--- a/src/maplexer.c
+++ b/src/maplexer.c
@@ -1,6 +1,6 @@
-#line 2 "src/maplexer.c"
+#line 1 "src/maplexer.c"
-#line 4 "src/maplexer.c"
+#line 3 "src/maplexer.c"
#define YY_INT_ALIGNED short int
@@ -620,7 +620,7 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static const flex_int16_t yy_accept[1737] =
+static const flex_int16_t yy_accept[1745] =
{ 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 346, 343, 1, 341, 334, 2, 343, 343,
@@ -672,147 +672,148 @@ static const flex_int16_t yy_accept[1737] =
340, 340, 340, 340, 340, 340, 340, 305, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 234, 318, 340, 236, 319,
- 340, 68, 0, 0, 0, 0, 0, 328, 328, 0,
- 0, 328, 0, 0, 0, 0, 0, 0, 0, 0,
+ 340, 68, 0, 0, 0, 0, 0, 0, 0, 328,
+ 328, 0, 0, 328, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 14, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 340, 9, 340, 340, 327, 330, 330, 2, 2,
- 0, 327, 340, 340, 340, 340, 340, 239, 340, 340,
- 340, 340, 340, 340, 340, 243, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 83, 340, 340, 340,
+ 0, 0, 329, 2, 340, 9, 340, 340, 327, 330,
+ 330, 2, 2, 0, 327, 340, 340, 340, 340, 340,
+ 239, 340, 340, 340, 340, 340, 340, 340, 243, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 83,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 258, 340, 340, 340, 340, 98, 340, 340, 340, 102,
- 340, 340, 340, 105, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 121, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 269, 340, 270, 340, 145,
+ 340, 340, 340, 258, 340, 340, 340, 340, 98, 340,
+ 340, 340, 102, 340, 340, 340, 105, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 121, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 269, 340,
+ 270, 340, 145, 340, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 340, 175, 340,
- 279, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 175, 340, 279, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 340, 340, 207,
- 340, 340, 340, 340, 340, 340, 340, 218, 340, 307,
- 340, 340, 340, 340, 309, 228, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 237, 325, 0, 328, 25,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 207, 340, 340, 340, 340, 340, 340, 340,
+ 218, 340, 307, 340, 340, 340, 340, 309, 228, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 237, 325,
+ 325, 0, 328, 25, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
- 0, 0, 0, 0, 326, 340, 10, 340, 2, 61,
- 340, 63, 340, 340, 240, 340, 340, 241, 340, 340,
- 340, 340, 340, 340, 246, 340, 72, 340, 76, 340,
- 340, 340, 340, 340, 340, 84, 340, 340, 340, 340,
- 256, 86, 340, 89, 340, 340, 257, 340, 340, 340,
- 340, 340, 340, 340, 100, 340, 340, 260, 340, 340,
- 108, 261, 340, 340, 110, 340, 340, 118, 340, 340,
-
- 186, 340, 340, 340, 340, 340, 125, 267, 340, 135,
- 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 0, 0, 56, 0, 0, 0, 0, 0, 326, 0,
+ 340, 10, 340, 2, 61, 340, 63, 340, 340, 240,
+ 340, 340, 241, 340, 340, 340, 340, 340, 340, 246,
+ 340, 72, 340, 76, 340, 340, 340, 340, 340, 340,
+ 84, 340, 340, 340, 340, 256, 86, 340, 89, 340,
+ 340, 257, 340, 340, 340, 340, 340, 340, 340, 100,
+ 340, 340, 260, 340, 340, 108, 261, 340, 340, 110,
+
+ 340, 340, 118, 340, 340, 186, 340, 340, 340, 340,
+ 340, 125, 267, 340, 135, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 276, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 277, 340, 252, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 276, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 277,
+ 340, 252, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 291, 340, 340,
+ 340, 340, 340, 340, 340, 340, 295, 340, 340, 340,
+ 340, 340, 340, 340, 340, 298, 299, 200, 340, 340,
+ 340, 340, 340, 340, 303, 340, 340, 210, 340, 216,
+
+ 340, 340, 340, 340, 222, 340, 340, 340, 340, 314,
+ 229, 340, 340, 340, 340, 340, 340, 235, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,
+ 0, 0, 0, 0, 43, 0, 0, 0, 31, 42,
+ 0, 29, 0, 0, 0, 0, 30, 0, 0, 0,
+ 0, 0, 0, 340, 340, 340, 340, 340, 340, 340,
+ 340, 242, 340, 70, 245, 340, 247, 340, 340, 340,
+ 340, 340, 79, 340, 80, 340, 340, 340, 340, 340,
+ 85, 340, 340, 340, 340, 91, 340, 94, 95, 340,
+ 259, 340, 97, 340, 340, 340, 340, 109, 264, 340,
+
+ 340, 340, 340, 340, 265, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 134, 136,
+ 137, 340, 340, 143, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 273, 340, 274,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 291, 340, 340, 340, 340, 340, 340, 340,
- 340, 295, 340, 340, 340, 340, 340, 340, 340, 340,
- 298, 299, 200, 340, 340, 340, 340, 340, 340, 303,
- 340, 340, 210, 340, 216, 340, 340, 340, 340, 222,
-
- 340, 340, 340, 340, 314, 229, 340, 340, 340, 340,
- 340, 340, 235, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 57, 0, 0, 0, 0, 43,
- 0, 0, 0, 31, 42, 0, 29, 0, 0, 0,
- 0, 30, 0, 0, 0, 0, 340, 340, 340, 340,
- 340, 340, 340, 340, 242, 340, 70, 245, 340, 247,
- 340, 340, 340, 340, 340, 79, 340, 80, 340, 340,
- 340, 340, 340, 85, 340, 340, 340, 340, 91, 340,
- 94, 95, 340, 259, 340, 97, 340, 340, 340, 340,
- 109, 264, 340, 340, 340, 340, 340, 265, 340, 340,
-
+ 340, 340, 340, 340, 280, 176, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 290, 289, 294, 185, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 134, 136, 137, 340, 340, 143, 340, 340, 340,
+ 340, 296, 340, 195, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 301, 302, 340, 304, 209, 340,
+
+ 212, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 233, 317, 53, 34, 0,
+ 0, 0, 0, 0, 0, 0, 0, 52, 0, 0,
+ 0, 0, 0, 0, 26, 0, 0, 0, 0, 0,
+ 50, 0, 0, 0, 326, 8, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 75, 340, 340,
+ 340, 340, 316, 340, 253, 340, 255, 340, 340, 340,
+ 93, 340, 340, 99, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 117, 340, 340, 340, 340, 123, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 139, 340,
+
+ 340, 146, 340, 340, 340, 340, 340, 340, 340, 340,
+ 155, 340, 340, 340, 340, 340, 161, 340, 340, 340,
+ 340, 340, 340, 171, 340, 340, 340, 340, 340, 177,
+ 340, 178, 340, 340, 340, 340, 184, 340, 340, 292,
+ 340, 293, 340, 340, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 273, 340, 274, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 280, 176, 340,
- 340, 340, 340, 340, 340, 340, 340, 340, 290, 289,
- 294, 185, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 296, 340, 195, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 301, 302, 340,
- 304, 209, 340, 212, 340, 340, 340, 340, 340, 340,
-
- 340, 340, 340, 340, 340, 340, 340, 340, 233, 317,
- 53, 34, 0, 0, 0, 0, 0, 0, 0, 0,
- 52, 0, 0, 0, 0, 0, 0, 26, 0, 0,
- 0, 0, 0, 50, 0, 0, 0, 8, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 340, 340, 75,
- 340, 340, 340, 340, 316, 340, 253, 340, 255, 340,
- 340, 340, 93, 340, 340, 99, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 117, 340, 340, 340, 340,
- 123, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 139, 340, 340, 146, 340, 340, 340, 340, 340, 340,
-
- 340, 340, 155, 340, 340, 340, 340, 340, 161, 340,
- 340, 340, 340, 340, 340, 171, 340, 340, 340, 340,
- 340, 177, 340, 178, 340, 340, 340, 340, 184, 340,
- 340, 292, 340, 293, 340, 340, 340, 340, 340, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 221, 340, 340, 340, 340, 340, 230, 231, 340, 340,
+ 0, 28, 0, 49, 41, 0, 0, 54, 0, 0,
+ 0, 32, 0, 0, 0, 0, 0, 0, 47, 0,
+
+ 0, 321, 11, 340, 340, 340, 340, 340, 67, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 340, 87,
+ 340, 340, 340, 340, 340, 340, 340, 106, 340, 340,
+ 340, 340, 116, 340, 340, 340, 122, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 140, 340, 340, 340,
+ 340, 340, 340, 340, 340, 151, 340, 340, 158, 159,
+ 160, 340, 340, 340, 340, 340, 168, 340, 340, 174,
+ 278, 340, 340, 340, 340, 340, 340, 340, 183, 340,
+ 340, 187, 340, 340, 189, 340, 340, 340, 193, 340,
+ 340, 340, 340, 340, 197, 340, 202, 340, 340, 300,
+
+ 340, 340, 340, 340, 340, 340, 340, 217, 115, 340,
+ 220, 340, 340, 340, 308, 310, 315, 340, 0, 51,
+ 0, 46, 33, 55, 0, 0, 0, 48, 36, 0,
+ 27, 0, 0, 340, 340, 64, 340, 66, 340, 71,
+ 340, 73, 340, 340, 78, 340, 59, 340, 340, 92,
+ 340, 340, 340, 340, 107, 340, 113, 114, 112, 340,
+ 120, 340, 340, 340, 340, 340, 128, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 154, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 221, 340, 340, 340, 340, 340, 230, 231,
- 340, 340, 0, 28, 0, 49, 41, 0, 0, 54,
- 0, 0, 0, 32, 0, 0, 0, 0, 0, 0,
- 47, 0, 0, 321, 11, 340, 340, 340, 340, 340,
-
- 67, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 87, 340, 340, 340, 340, 340, 340, 340, 106,
- 340, 340, 340, 340, 116, 340, 340, 340, 122, 340,
- 340, 340, 340, 340, 340, 340, 340, 340, 140, 340,
- 340, 340, 340, 340, 340, 340, 340, 151, 340, 340,
- 158, 159, 160, 340, 340, 340, 340, 340, 168, 340,
- 340, 174, 278, 340, 340, 340, 340, 340, 340, 340,
- 183, 340, 340, 187, 340, 340, 189, 340, 340, 340,
- 193, 340, 340, 340, 340, 340, 197, 340, 202, 340,
- 340, 300, 340, 340, 340, 340, 340, 340, 340, 217,
-
- 115, 340, 220, 340, 340, 340, 308, 310, 315, 340,
- 0, 51, 0, 46, 33, 55, 0, 0, 0, 48,
- 36, 0, 27, 0, 0, 340, 340, 64, 340, 66,
- 340, 71, 340, 73, 340, 340, 78, 340, 59, 340,
- 340, 92, 340, 340, 340, 340, 107, 340, 113, 114,
- 112, 340, 120, 340, 340, 340, 340, 340, 128, 340,
340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 154, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 340, 340, 340, 340, 340, 60, 340, 194,
-
- 340, 340, 340, 340, 340, 340, 340, 206, 208, 211,
- 340, 215, 219, 224, 227, 340, 340, 0, 0, 0,
- 0, 0, 0, 39, 0, 0, 340, 238, 340, 340,
- 74, 58, 77, 81, 340, 90, 96, 283, 340, 340,
- 111, 119, 340, 124, 266, 126, 340, 340, 340, 340,
- 340, 340, 144, 147, 340, 340, 340, 340, 340, 340,
- 340, 340, 162, 340, 340, 340, 340, 340, 340, 340,
- 340, 340, 285, 340, 340, 340, 340, 340, 340, 251,
- 340, 190, 191, 340, 340, 196, 340, 198, 201, 203,
- 340, 205, 340, 340, 340, 232, 40, 35, 38, 45,
-
- 44, 37, 0, 0, 62, 340, 340, 340, 340, 340,
- 340, 340, 340, 127, 340, 340, 340, 340, 340, 148,
- 149, 153, 150, 340, 340, 340, 157, 163, 340, 170,
- 167, 340, 340, 173, 340, 286, 340, 340, 340, 340,
- 288, 306, 340, 192, 297, 340, 204, 213, 340, 226,
- 0, 0, 340, 69, 340, 340, 340, 101, 340, 340,
- 340, 340, 340, 138, 340, 340, 340, 156, 340, 340,
- 172, 340, 340, 180, 181, 182, 340, 340, 340, 340,
- 0, 0, 340, 340, 340, 199, 104, 262, 129, 131,
- 133, 340, 340, 152, 340, 169, 275, 287, 340, 340,
-
- 340, 340, 0, 0, 340, 340, 82, 340, 340, 340,
- 340, 166, 188, 164, 340, 225, 0, 322, 65, 340,
- 340, 340, 141, 165, 340, 323, 340, 340, 340, 214,
- 179, 340, 340, 130, 132, 0
+
+ 340, 340, 340, 340, 340, 60, 340, 194, 340, 340,
+ 340, 340, 340, 340, 340, 206, 208, 211, 340, 215,
+ 219, 224, 227, 340, 340, 0, 0, 0, 0, 0,
+ 0, 39, 0, 0, 340, 238, 340, 340, 74, 58,
+ 77, 81, 340, 90, 96, 283, 340, 340, 111, 119,
+ 340, 124, 266, 126, 340, 340, 340, 340, 340, 340,
+ 144, 147, 340, 340, 340, 340, 340, 340, 340, 340,
+ 162, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 285, 340, 340, 340, 340, 340, 340, 251, 340, 190,
+ 191, 340, 340, 196, 340, 198, 201, 203, 340, 205,
+
+ 340, 340, 340, 232, 40, 35, 38, 45, 44, 37,
+ 0, 0, 62, 340, 340, 340, 340, 340, 340, 340,
+ 340, 127, 340, 340, 340, 340, 340, 148, 149, 153,
+ 150, 340, 340, 340, 157, 163, 340, 170, 167, 340,
+ 340, 173, 340, 286, 340, 340, 340, 340, 288, 306,
+ 340, 192, 297, 340, 204, 213, 340, 226, 0, 0,
+ 340, 69, 340, 340, 340, 101, 340, 340, 340, 340,
+ 340, 138, 340, 340, 340, 156, 340, 340, 172, 340,
+ 340, 180, 181, 182, 340, 340, 340, 340, 0, 0,
+ 340, 340, 340, 199, 104, 262, 129, 131, 133, 340,
+
+ 340, 152, 340, 169, 275, 287, 340, 340, 340, 340,
+ 0, 0, 340, 340, 82, 340, 340, 340, 340, 166,
+ 188, 164, 340, 225, 0, 322, 65, 340, 340, 340,
+ 141, 165, 340, 323, 340, 340, 340, 214, 179, 340,
+ 340, 130, 132, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -849,32 +850,32 @@ static const YY_CHAR yy_ec[256] =
static const YY_CHAR yy_meta[87] =
{ 0,
- 1, 1, 2, 1, 1, 3, 1, 1, 4, 1,
- 1, 5, 1, 6, 6, 6, 6, 6, 1, 6,
- 1, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 1, 7, 1,
- 6, 1, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 1, 1,
+ 1, 1, 2, 1, 1, 3, 1, 1, 3, 1,
+ 1, 4, 1, 5, 5, 5, 5, 5, 1, 5,
+ 1, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 1, 3, 1,
+ 5, 1, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 1, 1,
1, 1, 1, 1, 1, 1
} ;
-static const flex_int16_t yy_base[1761] =
+static const flex_int16_t yy_base[1770] =
{ 0,
0, 0, 86, 0, 171, 172, 173, 177, 181, 182,
- 226, 0, 1082, 3985, 185, 3985, 3985, 0, 1013, 173,
+ 226, 0, 1383, 3953, 185, 3953, 3953, 0, 1350, 173,
296, 353, 310, 304, 353, 416, 359, 354, 421, 436,
356, 467, 156, 290, 474, 473, 354, 483, 532, 275,
- 533, 579, 585, 540, 374, 631, 0, 961, 907, 810,
- 3985, 193, 3985, 194, 820, 732, 751, 700, 184, 314,
- 611, 183, 188, 725, 424, 479, 521, 615, 280, 644,
+ 533, 579, 585, 540, 374, 631, 0, 1247, 1195, 1189,
+ 3953, 193, 3953, 194, 1191, 1149, 1186, 1139, 184, 314,
+ 611, 183, 188, 1068, 424, 479, 521, 615, 280, 644,
575, 284, 299, 628, 624, 636, 306, 637, 355, 343,
- 367, 678, 157, 653, 687, 3985, 3985, 208, 687, 678,
- 0, 411, 418, 475, 0, 3985, 666, 661, 473, 477,
+ 367, 678, 157, 1002, 1012, 3953, 3953, 208, 1005, 979,
+ 0, 411, 418, 475, 0, 3953, 877, 824, 473, 477,
- 492, 484, 209, 0, 638, 616, 690, 704, 0, 706,
- 201, 603, 3985, 763, 849, 720, 203, 531, 759, 525,
+ 492, 484, 209, 0, 769, 748, 690, 704, 0, 706,
+ 201, 732, 3953, 763, 849, 720, 203, 531, 759, 525,
649, 524, 645, 551, 686, 0, 685, 703, 687, 756,
755, 0, 686, 690, 0, 727, 725, 758, 769, 771,
754, 760, 766, 781, 769, 782, 836, 769, 771, 774,
@@ -886,16 +887,16 @@ static const flex_int16_t yy_base[1761] =
989, 1003, 1014, 1025, 1011, 1039, 1025, 0, 0, 1033,
0, 1037, 1026, 1034, 1044, 1047, 1031, 1047, 1035, 1037,
- 1056, 534, 3985, 499, 493, 486, 3985, 487, 3985, 466,
- 1087, 1099, 1093, 316, 1103, 451, 3985, 3985, 3985, 3985,
+ 1056, 695, 3953, 652, 618, 603, 3953, 522, 3953, 573,
+ 1087, 1099, 1093, 316, 1103, 451, 3953, 3953, 3953, 3953,
1059, 1061, 1060, 1095, 1088, 1092, 1088, 1093, 1103, 1101,
- 1090, 1100, 1095, 1099, 1101, 3985, 1110, 1095, 1104, 1097,
- 3985, 1101, 3985, 1105, 1121, 1106, 1115, 1116, 1144, 1126,
- 1138, 1140, 420, 1163, 1168, 1159, 3985, 415, 274, 3985,
- 3985, 455, 3985, 444, 0, 3985, 3985, 3985, 0, 3985,
+ 1090, 1100, 1095, 1099, 1101, 3953, 1110, 1095, 1104, 1097,
+ 3953, 1101, 3953, 1105, 1121, 1106, 1115, 1116, 1144, 1126,
+ 1138, 1140, 632, 1163, 1168, 1159, 585, 575, 274, 3953,
+ 3953, 613, 3953, 575, 0, 3953, 3953, 3953, 0, 3953,
1221, 1154, 1210, 1156, 1163, 1184, 722, 189, 207, 326,
- 434, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559,
+ 564, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559,
724, 1186, 1208, 1213, 1211, 1218, 1213, 1218, 1226, 1228,
1230, 1222, 1213, 1231, 1218, 1219, 1222, 1238, 1223, 1224,
1229, 1230, 1294, 0, 1277, 1280, 1305, 1288, 1302, 1307,
@@ -906,355 +907,357 @@ static const flex_int16_t yy_base[1761] =
1410, 1395, 1411, 1444, 0, 1450, 1461, 1544, 1464, 1473,
1476, 1477, 1598, 1478, 1464, 1468, 1481, 1467, 1484, 1477,
- 1472, 0, 430, 1490, 1491, 1483, 1476, 1477, 1495, 1518,
+ 1472, 0, 560, 1490, 1491, 1483, 1476, 1477, 1495, 1518,
1494, 1488, 1533, 1540, 1520, 1575, 1534, 1548, 1537, 1556,
1561, 1571, 1570, 1572, 1581, 1589, 1594, 1598, 1606, 1609,
1596, 1607, 1610, 1607, 1619, 1602, 1611, 0, 1624, 1617,
1616, 1614, 1632, 1615, 1635, 1650, 1644, 1658, 1656, 1657,
1649, 1663, 1665, 1661, 1653, 0, 0, 1654, 0, 0,
- 1659, 3985, 358, 522, 354, 573, 735, 799, 1680, 1687,
- 849, 871, 1680, 1672, 1682, 1671, 1681, 1676, 1680, 1683,
- 1701, 1698, 1689, 1709, 1692, 1695, 1702, 1712, 1700, 1716,
- 1718, 1723, 1719, 1723, 3985, 1724, 1713, 1718, 1718, 1720,
-
- 1716, 1734, 1738, 1739, 1739, 1729, 1740, 1752, 583, 1033,
- 1752, 1758, 0, 1751, 1764, 1010, 3985, 0, 1763, 1764,
- 1180, 1186, 1762, 1762, 1774, 1762, 1782, 327, 1778, 1767,
- 1776, 1767, 1789, 1772, 1788, 0, 1789, 1795, 1785, 1779,
- 1779, 1782, 1803, 1796, 1801, 1796, 1794, 1816, 1805, 1827,
- 1828, 1818, 1831, 1813, 1835, 1823, 1839, 1831, 1842, 1827,
- 0, 1845, 1846, 1845, 1838, 1836, 1851, 1853, 1858, 0,
- 1840, 1841, 1853, 1848, 1852, 1863, 1868, 1854, 1872, 1875,
- 1864, 1864, 1885, 1877, 1877, 0, 1892, 1887, 1894, 1888,
- 1894, 1902, 1894, 1894, 1908, 0, 1900, 1912, 1912, 0,
-
- 1900, 1905, 1912, 1918, 1919, 1915, 1925, 1911, 1947, 1930,
- 1927, 1918, 1938, 1929, 1938, 1938, 1941, 1947, 1954, 1960,
- 1964, 1957, 1971, 1967, 1966, 1958, 1968, 1967, 0, 1973,
- 0, 1982, 1986, 1964, 1976, 1974, 1988, 1977, 1992, 1999,
- 2004, 2000, 2017, 2010, 2000, 2003, 2017, 2005, 2024, 2009,
- 2025, 2028, 2009, 2032, 2033, 2021, 2026, 2022, 2043, 2036,
- 2034, 2027, 2044, 2048, 2051, 2042, 2054, 2048, 2051, 2045,
- 2059, 2056, 2059, 2076, 2067, 2078, 2077, 0, 2077, 0,
- 2082, 2074, 2076, 2084, 2079, 0, 2086, 2082, 2102, 2084,
- 2087, 2103, 2103, 2094, 2102, 0, 3985, 1257, 1307, 3985,
-
- 2101, 2111, 2114, 2112, 2121, 2106, 2119, 2128, 2121, 2134,
- 2131, 2139, 2125, 2128, 2131, 2148, 2136, 2137, 2138, 2138,
- 2142, 2143, 2150, 2159, 2153, 2146, 2150, 2161, 3985, 2152,
- 2162, 2176, 1360, 2174, 3985, 2169, 0, 2172, 0, 0,
- 2165, 0, 2183, 2175, 0, 2177, 2189, 0, 2203, 2190,
- 2202, 2192, 2193, 2210, 0, 2211, 2210, 2215, 2204, 2214,
- 2208, 2218, 2225, 2209, 2230, 0, 2220, 2214, 2216, 2217,
- 0, 0, 2230, 0, 2221, 2226, 0, 2225, 2245, 2234,
- 2252, 2237, 2261, 2250, 0, 2249, 2254, 0, 2270, 2255,
- 0, 0, 2260, 2274, 2292, 2265, 2281, 0, 2285, 2265,
-
- 0, 2277, 2289, 2266, 2292, 2289, 2324, 0, 2284, 0,
- 2283, 2303, 2313, 2304, 2304, 2325, 2307, 2315, 2334, 2325,
- 2321, 2332, 2342, 2347, 2323, 2349, 2339, 2350, 2342, 2355,
- 2338, 0, 2335, 2360, 2343, 2350, 2369, 2359, 2355, 2375,
- 2355, 2382, 2376, 2386, 0, 2376, 0, 2390, 2383, 2376,
- 2377, 2384, 2382, 2398, 2390, 2388, 2408, 2392, 2397, 2394,
- 2398, 2402, 2398, 2403, 2404, 2413, 2420, 2424, 2422, 2413,
- 2433, 2445, 2428, 2425, 2441, 2438, 2445, 2435, 2439, 2438,
- 0, 0, 2471, 2441, 2441, 2449, 2461, 2465, 2457, 0,
- 2467, 2457, 2469, 2467, 0, 2479, 2480, 2473, 2466, 0,
-
- 2493, 2492, 2492, 2475, 0, 0, 2485, 2508, 2494, 2515,
- 2498, 2501, 0, 2516, 2503, 2505, 2520, 2518, 2523, 2526,
- 2515, 2525, 2526, 2518, 3985, 2535, 2535, 2540, 2541, 3985,
- 2524, 2543, 2541, 3985, 3985, 2552, 3985, 2546, 2548, 2551,
- 2556, 3985, 2548, 1446, 2567, 2570, 2560, 2562, 2562, 2559,
- 2572, 2567, 2563, 2573, 0, 2582, 0, 0, 2569, 0,
- 2572, 2574, 2577, 2596, 2588, 0, 2593, 0, 2583, 2586,
- 2591, 2588, 2596, 0, 2610, 2603, 2599, 2613, 0, 2618,
- 0, 2615, 2612, 0, 2609, 0, 2615, 2631, 2616, 2633,
- 0, 0, 2625, 2626, 2642, 2619, 2627, 0, 2642, 2638,
-
- 2650, 2648, 2649, 2652, 2656, 2642, 2663, 2650, 2646, 2676,
- 2662, 0, 0, 2664, 2657, 2670, 2661, 2665, 2667, 2669,
- 2671, 2669, 2689, 2692, 2682, 2690, 2698, 2701, 2690, 2687,
- 0, 2689, 0, 2696, 2694, 2695, 2698, 2699, 2698, 2719,
- 2714, 2722, 2724, 2713, 2712, 2723, 2738, 0, 0, 2736,
- 327, 2717, 2727, 2742, 2742, 2739, 2739, 2734, 0, 0,
- 0, 0, 2750, 2747, 2747, 2745, 2760, 2765, 2748, 2750,
- 2751, 2759, 2774, 2756, 2768, 2767, 0, 2761, 2782, 2783,
- 2769, 2789, 2786, 2779, 2792, 2805, 2800, 0, 0, 2794,
- 0, 0, 2784, 2790, 2790, 2793, 2811, 2811, 2799, 2809,
-
- 2811, 2826, 2817, 2814, 2830, 2820, 2831, 2817, 0, 0,
- 3985, 3985, 2826, 2817, 2829, 2826, 2823, 2845, 2837, 2838,
- 3985, 2852, 2832, 2847, 2847, 2860, 2848, 3985, 2854, 2865,
- 2853, 2861, 2858, 3985, 2875, 2881, 288, 0, 2861, 2870,
- 2879, 2888, 2870, 2887, 2874, 2880, 2893, 2884, 2895, 0,
- 2891, 2887, 2892, 2904, 0, 2907, 0, 2903, 0, 2911,
- 2912, 2910, 0, 2907, 2926, 0, 2916, 2919, 2922, 2919,
- 2925, 2935, 2920, 2925, 2930, 0, 2940, 2936, 2945, 2946,
- 0, 2944, 2949, 2952, 2939, 2955, 2937, 2948, 2950, 2954,
- 0, 2960, 2966, 0, 2967, 2976, 2959, 2974, 2969, 2969,
-
- 2978, 2989, 0, 2986, 2984, 2989, 2998, 2996, 0, 2993,
- 3002, 2983, 3000, 2992, 3007, 0, 3004, 3003, 3008, 3012,
- 3007, 0, 3009, 0, 3007, 3026, 3016, 3017, 0, 3036,
- 3032, 0, 3025, 0, 3023, 3040, 3026, 3043, 3047, 3039,
- 3042, 3054, 3060, 3060, 3059, 3056, 3047, 3062, 3054, 3060,
- 3064, 3073, 3063, 3070, 3061, 3064, 3080, 3088, 3081, 3090,
- 3094, 3087, 0, 3098, 3086, 3089, 3106, 3108, 0, 0,
- 3096, 3109, 3110, 3985, 3101, 3985, 3985, 3107, 3103, 3985,
- 3109, 3106, 3118, 3985, 3125, 3124, 3115, 3111, 3128, 3132,
- 3985, 3142, 3131, 3985, 0, 3132, 3131, 3129, 3139, 3142,
-
- 0, 3143, 3144, 3142, 3153, 3162, 3168, 3170, 3161, 3175,
- 3160, 0, 3167, 3169, 3180, 3166, 3168, 3170, 3185, 0,
- 3176, 3190, 3188, 3193, 0, 3198, 3182, 3188, 0, 3189,
- 3187, 3200, 3196, 3197, 3196, 3198, 3202, 3206, 3212, 3202,
- 3205, 3221, 3219, 3234, 3220, 3235, 3243, 3241, 3225, 3248,
- 0, 0, 0, 3224, 3237, 3234, 3249, 3235, 3254, 3238,
- 3260, 0, 0, 3250, 3263, 3251, 3266, 3255, 3262, 3254,
- 0, 3270, 3260, 0, 3268, 3274, 0, 3273, 3275, 3280,
- 0, 3284, 3297, 3295, 3284, 3286, 0, 3291, 0, 3292,
- 3304, 0, 3299, 3286, 3305, 3295, 3302, 3318, 3300, 0,
-
- 0, 3298, 0, 3318, 3312, 3321, 0, 0, 0, 3312,
- 3315, 3985, 3329, 3985, 3985, 3985, 3307, 3314, 3323, 3985,
- 3325, 3346, 3985, 3337, 3340, 3334, 3341, 0, 3355, 0,
- 3348, 0, 3346, 0, 3362, 3350, 0, 3357, 0, 3353,
- 3360, 0, 3362, 3370, 3368, 3375, 0, 3364, 0, 0,
- 0, 3368, 0, 3366, 3380, 3369, 3384, 3390, 0, 3391,
- 3392, 3387, 3384, 3399, 3396, 3398, 3406, 3405, 3391, 3413,
- 0, 3401, 3416, 3414, 3404, 3424, 3427, 3428, 3415, 3435,
- 3432, 3429, 3419, 3434, 3430, 3441, 3427, 3437, 3446, 3438,
- 3448, 3451, 3445, 3455, 3452, 3448, 3462, 0, 3460, 0,
-
- 3456, 3452, 3459, 3463, 3465, 3468, 3480, 0, 0, 0,
- 3474, 0, 0, 3470, 0, 3478, 3481, 3492, 3493, 3494,
- 3481, 3481, 3485, 3985, 3496, 3490, 3486, 0, 3508, 3511,
- 0, 0, 0, 3498, 3506, 0, 0, 0, 3505, 3506,
- 0, 0, 3515, 0, 0, 0, 3507, 3532, 3533, 3517,
- 3537, 3517, 0, 0, 3540, 3528, 3540, 3538, 3552, 3540,
- 3552, 3552, 0, 3554, 3541, 3553, 3550, 3549, 3563, 3563,
- 3558, 3546, 0, 3564, 3559, 3555, 3576, 3561, 3562, 0,
- 3582, 0, 0, 3566, 3577, 0, 3594, 0, 0, 0,
- 3578, 0, 3592, 3586, 3583, 0, 3985, 3985, 3985, 3985,
-
- 3985, 3985, 3590, 3601, 0, 3592, 3592, 3599, 3591, 3603,
- 3607, 3604, 3603, 0, 3612, 3613, 3624, 3612, 3614, 0,
- 0, 0, 0, 3621, 3621, 3632, 0, 0, 3630, 0,
- 0, 3627, 3639, 0, 3640, 0, 3647, 3632, 3643, 3637,
- 0, 0, 3655, 0, 0, 3645, 0, 3657, 3653, 0,
- 3656, 3643, 3659, 0, 3654, 3661, 3664, 0, 3667, 3658,
- 3679, 3681, 3668, 0, 3682, 3687, 3682, 0, 3671, 3685,
- 0, 3680, 3689, 0, 0, 0, 3695, 3701, 3701, 3687,
- 3684, 3707, 3701, 3710, 3715, 0, 0, 0, 3717, 3719,
- 0, 3698, 3715, 0, 3726, 0, 0, 0, 3728, 3734,
-
- 3726, 3723, 3739, 285, 3727, 3731, 0, 3743, 3744, 3748,
- 3751, 0, 0, 0, 3742, 0, 273, 3985, 0, 3745,
- 3746, 3747, 0, 0, 3750, 3985, 3746, 3751, 3752, 0,
- 0, 3756, 3759, 0, 0, 3985, 3824, 3831, 3838, 3845,
- 3852, 309, 3859, 3866, 3873, 3880, 3887, 3894, 3901, 3908,
- 3914, 3921, 3928, 3935, 3942, 3949, 3956, 3963, 3970, 3977
+ 1659, 3953, 627, 564, 643, 1688, 528, 1689, 735, 799,
+ 1683, 1715, 849, 871, 1682, 1669, 1679, 1671, 1681, 1676,
+ 1680, 1683, 1703, 1700, 1700, 1720, 1704, 1705, 1713, 1723,
+ 1709, 1726, 1727, 1733, 1728, 1731, 3953, 1732, 1720, 1725,
+
+ 1726, 1728, 1724, 1742, 1741, 1742, 1740, 1729, 1755, 1760,
+ 1033, 1148, 464, 1741, 1750, 0, 1745, 1765, 1010, 3953,
+ 0, 1773, 1774, 1186, 1257, 1771, 1771, 1783, 1770, 1790,
+ 452, 1786, 1775, 1784, 1775, 1797, 1780, 1795, 0, 1796,
+ 1803, 1793, 1787, 1787, 1790, 1803, 1801, 1806, 1797, 1797,
+ 1813, 1805, 1828, 1829, 1828, 1841, 1822, 1844, 1832, 1847,
+ 1839, 1850, 1835, 0, 1853, 1854, 1853, 1846, 1843, 1858,
+ 1861, 1866, 0, 1848, 1849, 1861, 1852, 1856, 1865, 1869,
+ 1857, 1875, 1877, 1864, 1864, 1886, 1878, 1887, 0, 1902,
+ 1896, 1901, 1899, 1902, 1910, 1903, 1902, 1916, 0, 1908,
+
+ 1920, 1919, 0, 1907, 1913, 1920, 1926, 1927, 1919, 1929,
+ 1913, 1964, 1934, 1935, 1926, 1946, 1939, 1939, 1948, 1951,
+ 1956, 1963, 1969, 1971, 1963, 1988, 1974, 1971, 1964, 1974,
+ 1972, 0, 1977, 0, 1986, 1985, 1972, 1984, 1983, 1987,
+ 1980, 1997, 2007, 2014, 2008, 2028, 2021, 2011, 2015, 2027,
+ 2015, 2029, 2020, 2034, 2037, 2019, 2040, 2041, 2029, 2033,
+ 2029, 2051, 2044, 2042, 2035, 2052, 2052, 2055, 2044, 2058,
+ 2056, 2059, 2053, 2069, 2064, 2070, 2087, 2078, 2090, 2084,
+ 0, 2088, 0, 2093, 2083, 2084, 2090, 2086, 0, 2094,
+ 2090, 2109, 2091, 2095, 2111, 2111, 2102, 2110, 0, 461,
+
+ 452, 1307, 1393, 3953, 2105, 2115, 2116, 2116, 2129, 2114,
+ 2127, 2138, 2129, 2145, 2142, 2150, 2137, 2138, 2141, 2157,
+ 2144, 2145, 2146, 2146, 2150, 2151, 2158, 2167, 2160, 2153,
+ 2158, 2169, 3953, 2160, 2170, 2182, 1446, 2166, 401, 1540,
+ 2172, 0, 2178, 0, 0, 2174, 0, 2197, 2193, 0,
+ 2188, 2206, 0, 2215, 2201, 2214, 2202, 2203, 2219, 0,
+ 2219, 2218, 2221, 2210, 2221, 2215, 2225, 2230, 2214, 2237,
+ 0, 2227, 2221, 2223, 2223, 0, 0, 2234, 0, 2225,
+ 2248, 0, 2227, 2245, 2236, 2255, 2254, 2273, 2261, 0,
+ 2261, 2264, 0, 2280, 2264, 0, 0, 2268, 2282, 2303,
+
+ 2270, 2286, 0, 2293, 2273, 0, 2284, 2296, 2274, 2300,
+ 2297, 2333, 0, 2289, 0, 2286, 2303, 2321, 2314, 2312,
+ 2337, 2317, 2324, 2343, 2330, 2328, 2335, 2347, 2355, 2331,
+ 2356, 2346, 2358, 2350, 2363, 2346, 0, 2341, 2365, 2345,
+ 2359, 2380, 2369, 2365, 2385, 2365, 2390, 2385, 2397, 0,
+ 2386, 0, 2400, 2392, 2385, 2386, 2392, 2388, 2405, 2397,
+ 2393, 2413, 2400, 2405, 2401, 2405, 2410, 2406, 2411, 2412,
+ 2419, 2422, 2429, 2434, 2427, 2444, 2447, 2439, 2436, 2458,
+ 2450, 2456, 2446, 2449, 2447, 0, 0, 2468, 2449, 2450,
+ 2459, 2471, 2475, 2467, 0, 2477, 2464, 2477, 2475, 0,
+
+ 2488, 2489, 2488, 2474, 0, 2492, 2499, 2502, 2485, 0,
+ 0, 2496, 2517, 2505, 2525, 2508, 2510, 0, 2525, 2512,
+ 2513, 2526, 2525, 2530, 2531, 2520, 2533, 2534, 2525, 3953,
+ 2542, 2543, 2548, 2549, 3953, 2532, 2549, 2546, 3953, 3953,
+ 2554, 3953, 2555, 2559, 2561, 2566, 3953, 2558, 1544, 2575,
+ 2579, 2558, 398, 2581, 2576, 2575, 2572, 2584, 2579, 2576,
+ 2585, 0, 2593, 0, 0, 2580, 0, 2587, 2586, 2589,
+ 2609, 2599, 0, 2603, 0, 2593, 2596, 2602, 2597, 2603,
+ 0, 2615, 2612, 2610, 2623, 0, 2628, 0, 2625, 2620,
+ 0, 2619, 0, 2625, 2645, 2629, 2647, 0, 0, 2638,
+
+ 2639, 2654, 2631, 2640, 0, 2654, 2649, 2661, 2663, 2661,
+ 2664, 2669, 2653, 2673, 2660, 2656, 2679, 2673, 0, 0,
+ 2673, 2666, 2682, 2675, 2676, 2677, 2677, 2681, 2679, 2703,
+ 2705, 2696, 2703, 2711, 2713, 2702, 2700, 0, 2701, 0,
+ 2707, 2705, 2710, 2710, 2711, 2711, 2730, 2724, 2732, 2734,
+ 2724, 2721, 2730, 2743, 0, 0, 2745, 430, 2728, 2737,
+ 2752, 2752, 2747, 2749, 2744, 0, 0, 0, 0, 2764,
+ 2760, 2761, 2758, 2773, 2777, 2760, 2763, 2763, 2770, 2785,
+ 2771, 2780, 2779, 0, 2774, 2793, 2793, 2779, 2799, 2797,
+ 2788, 2799, 2817, 2805, 0, 0, 2803, 0, 0, 2795,
+
+ 2799, 2799, 2801, 2821, 2821, 2813, 2824, 2824, 2839, 2829,
+ 2826, 2843, 2832, 2842, 2828, 0, 0, 3953, 3953, 2841,
+ 2829, 2841, 2839, 2834, 2855, 2847, 2848, 3953, 2863, 2841,
+ 2854, 2852, 2869, 2859, 3953, 2864, 2875, 2863, 2869, 2868,
+ 3953, 2891, 2893, 358, 352, 0, 2869, 2885, 2892, 2901,
+ 2882, 2899, 2887, 2892, 2904, 2895, 2910, 0, 2902, 2897,
+ 2901, 2914, 0, 2917, 0, 2914, 0, 2920, 2919, 2915,
+ 0, 2916, 2937, 0, 2926, 2929, 2932, 2929, 2937, 2946,
+ 2931, 2937, 2944, 0, 2953, 2950, 2958, 2959, 0, 2956,
+ 2961, 2965, 2951, 2966, 2948, 2963, 2961, 2964, 0, 2969,
+
+ 2976, 0, 2977, 2987, 2968, 2981, 2974, 2978, 2989, 2999,
+ 0, 2996, 2994, 2999, 3010, 3007, 0, 3004, 3014, 2997,
+ 3013, 3006, 3020, 0, 3017, 3015, 3020, 3025, 3019, 0,
+ 3026, 0, 3017, 3031, 3025, 3026, 0, 3046, 3042, 0,
+ 3036, 0, 3032, 3047, 3035, 3054, 3057, 3049, 3052, 3064,
+ 3072, 3071, 3070, 3068, 3061, 3075, 3068, 3073, 3077, 3085,
+ 3075, 3083, 3073, 3075, 3091, 3098, 3097, 3099, 3104, 3097,
+ 0, 3109, 3095, 3096, 3111, 3117, 0, 0, 3107, 3119,
+ 3120, 3953, 3111, 3953, 3953, 3117, 3115, 3953, 3120, 3117,
+ 3130, 3953, 3139, 3137, 3129, 3124, 3141, 3144, 3953, 3147,
+
+ 3142, 295, 0, 3146, 3142, 3139, 3149, 3151, 0, 3147,
+ 3151, 3151, 3161, 3168, 3173, 3179, 3172, 3185, 3170, 0,
+ 3177, 3179, 3192, 3177, 3179, 3182, 3197, 0, 3189, 3202,
+ 3200, 3205, 0, 3210, 3193, 3199, 0, 3200, 3198, 3209,
+ 3206, 3207, 3206, 3207, 3206, 3213, 3221, 3210, 3211, 3226,
+ 3228, 3245, 3230, 3245, 3253, 3251, 3237, 3259, 0, 0,
+ 0, 3235, 3249, 3246, 3262, 3247, 3266, 3250, 3272, 0,
+ 0, 3261, 3274, 3262, 3277, 3264, 3272, 3264, 0, 3280,
+ 3269, 0, 3272, 3281, 0, 3282, 3283, 3286, 0, 3289,
+ 3306, 3306, 3294, 3296, 0, 3301, 0, 3302, 3316, 0,
+
+ 3310, 3297, 3317, 3307, 3315, 3330, 3312, 0, 0, 3310,
+ 0, 3330, 3323, 3332, 0, 0, 0, 3323, 3326, 3953,
+ 3338, 3953, 3953, 3953, 3317, 3324, 3333, 3953, 3334, 3350,
+ 3953, 3348, 3349, 3341, 3344, 0, 3360, 0, 3357, 0,
+ 3357, 0, 3371, 3361, 0, 3369, 0, 3364, 3371, 0,
+ 3374, 3382, 3381, 3387, 0, 3376, 0, 0, 0, 3380,
+ 0, 3378, 3391, 3380, 3395, 3401, 0, 3400, 3402, 3397,
+ 3395, 3408, 3406, 3407, 3410, 3412, 3400, 3421, 0, 3407,
+ 3421, 3423, 3415, 3433, 3438, 3440, 3426, 3446, 3444, 3441,
+ 3432, 3446, 3442, 3453, 3439, 3448, 3457, 3449, 3459, 3460,
+
+ 3455, 3465, 3463, 3457, 3472, 0, 3469, 0, 3460, 3459,
+ 3468, 3471, 3471, 3473, 3489, 0, 0, 0, 3485, 0,
+ 0, 3479, 0, 3489, 3493, 3503, 3504, 3506, 3493, 3494,
+ 3497, 3953, 3506, 3501, 3501, 0, 3519, 3522, 0, 0,
+ 0, 3509, 3517, 0, 0, 0, 3512, 3517, 0, 0,
+ 3524, 0, 0, 0, 3516, 3536, 3540, 3526, 3545, 3523,
+ 0, 0, 3545, 3537, 3551, 3549, 3561, 3551, 3562, 3564,
+ 0, 3565, 3552, 3565, 3562, 3562, 3575, 3575, 3570, 3558,
+ 0, 3575, 3570, 3566, 3587, 3570, 3571, 0, 3593, 0,
+ 0, 3575, 3586, 0, 3598, 0, 0, 0, 3585, 0,
+
+ 3601, 3594, 3589, 0, 3953, 3953, 3953, 3953, 3953, 3953,
+ 3599, 3603, 0, 3606, 3603, 3608, 3602, 3616, 3619, 3617,
+ 3616, 0, 3626, 3629, 3637, 3624, 3626, 0, 0, 0,
+ 0, 3632, 3632, 3643, 0, 0, 3641, 0, 0, 3636,
+ 3648, 0, 3651, 0, 3656, 3641, 3652, 3641, 0, 0,
+ 3660, 0, 0, 3651, 0, 3664, 3661, 0, 3671, 3645,
+ 3671, 0, 3665, 3670, 3675, 0, 3680, 3670, 3692, 3693,
+ 3684, 0, 3695, 3698, 3693, 0, 3681, 3695, 0, 3690,
+ 3698, 0, 0, 0, 3704, 3710, 3710, 3698, 3693, 3716,
+ 3708, 3716, 3722, 0, 0, 0, 3726, 3727, 0, 3706,
+
+ 3721, 0, 3737, 0, 0, 0, 3742, 3743, 3737, 3734,
+ 3752, 291, 3737, 3744, 0, 3755, 3760, 3761, 3762, 0,
+ 0, 0, 3753, 0, 288, 285, 0, 3755, 3756, 3757,
+ 0, 0, 3759, 273, 3755, 3760, 3761, 0, 0, 3764,
+ 3767, 0, 0, 3953, 3832, 3837, 3842, 3847, 3852, 310,
+ 3857, 3862, 3867, 3872, 3877, 3882, 3887, 3892, 3897, 3902,
+ 3907, 3912, 3917, 3922, 3927, 3932, 3937, 3942, 3947
} ;
-static const flex_int16_t yy_def[1761] =
+static const flex_int16_t yy_def[1770] =
{ 0,
- 1736, 1, 1736, 3, 1737, 1737, 1738, 1738, 1739, 1739,
- 1736, 11, 1736, 1736, 1736, 1736, 1736, 1740, 1741, 1736,
- 1742, 1743, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1744, 1745, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1746, 1747, 1736, 1736, 1736, 1736, 1736, 1748, 1749,
- 1750, 1736, 1736, 1736, 1751, 1736, 1736, 1742, 1742, 1742,
-
- 1742, 1742, 1736, 1740, 1741, 1741, 1736, 1736, 1742, 1742,
- 1742, 1752, 1736, 1753, 1754, 1736, 1736, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1744, 1736, 1745, 1745, 1736, 1736, 1755, 1736, 1756,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1746, 1746, 1746, 1746, 1736, 1747, 1757, 1736,
- 1736, 1748, 1736, 1749, 1750, 1736, 1736, 1736, 1751, 1736,
- 1758, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1742, 1742,
-
- 1752, 1736, 1753, 1742, 1759, 1754, 1758, 1736, 1736, 1736,
- 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1736, 1755, 1755, 1756, 1756, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
-
- 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1757, 1757,
- 307, 1742, 1742, 1742, 1742, 1736, 1736, 1742, 1760, 307,
- 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736,
-
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1746, 1746, 1746, 1736, 1742, 1742, 1742, 1760, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1746, 1746, 1736, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736,
-
- 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742,
-
- 1742, 1742, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1736, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 1736, 1742, 1742, 1742, 1742,
- 1742, 1742, 1742, 1742, 1742, 0, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736
+ 1744, 1, 1744, 3, 1745, 1745, 1746, 1746, 1747, 1747,
+ 1744, 11, 1744, 1744, 1744, 1744, 1744, 1748, 1749, 1744,
+ 1750, 1751, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1752, 1753, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1754, 1755, 1744, 1744, 1744, 1744, 1744, 1756, 1757,
+ 1758, 1744, 1744, 1744, 1759, 1744, 1744, 1750, 1750, 1750,
+
+ 1750, 1750, 1744, 1748, 1749, 1749, 1744, 1744, 1750, 1750,
+ 1750, 1760, 1744, 1761, 1762, 1744, 1744, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1752, 1744, 1753, 1753, 1744, 1744, 1763, 1744, 1764,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1754, 1754, 1754, 1754, 1744, 1755, 1765, 1744,
+ 1744, 1756, 1744, 1757, 1758, 1744, 1744, 1744, 1759, 1744,
+ 1766, 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1750, 1750,
+
+ 1760, 1744, 1761, 1750, 1767, 1762, 1766, 1744, 1744, 1744,
+ 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1744, 1763, 1744, 1763, 1764, 1744, 1764, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, 1754, 1754,
+ 1765, 1765, 1744, 307, 1750, 1750, 1750, 1750, 1744, 1744,
+ 1750, 1768, 307, 1744, 1744, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744,
+
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1754, 1754, 1754, 1744, 1769,
+ 1750, 1750, 1750, 1768, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, 1754,
+ 1754, 1769, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1754, 1754, 1754, 1744, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754,
+
+ 1754, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1754, 1754,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1754, 1754,
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+
+ 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1750, 1754, 1744, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 1744, 1750, 1750, 1750, 1750, 1750, 1750,
+ 1750, 1750, 1750, 0, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744
} ;
-static const flex_int16_t yy_nxt[4072] =
+static const flex_int16_t yy_nxt[4040] =
{ 0,
14, 15, 16, 15, 14, 17, 18, 14, 17, 19,
14, 14, 14, 20, 21, 22, 23, 23, 14, 14,
@@ -1278,7 +1281,7 @@ static const flex_int16_t yy_nxt[4072] =
90, 93, 92, 96, 96, 93, 103, 107, 103, 108,
108, 160, 97, 97, 103, 103, 103, 103, 231, 238,
- 232, 232, 237, 227, 279, 516, 516, 239, 280, 103,
+ 232, 232, 237, 227, 279, 519, 519, 239, 280, 103,
103, 103, 103, 298, 299, 310, 310, 300, 300, 311,
311, 94, 160, 300, 300, 94, 14, 15, 16, 15,
14, 17, 18, 14, 17, 14, 14, 14, 14, 14,
@@ -1291,69 +1294,69 @@ static const flex_int16_t yy_nxt[4072] =
47, 47, 47, 47, 14, 14, 14, 14, 14, 14,
14, 14, 110, 110, 109, 161, 188, 251, 257, 162,
- 258, 111, 1726, 510, 116, 280, 108, 108, 467, 467,
- 233, 233, 468, 468, 1718, 117, 118, 1294, 119, 234,
- 1223, 266, 300, 300, 745, 120, 161, 188, 251, 257,
+ 258, 111, 273, 512, 116, 513, 108, 108, 469, 469,
+ 233, 233, 470, 470, 273, 117, 118, 1734, 119, 234,
+ 1726, 266, 300, 300, 273, 120, 161, 188, 251, 257,
162, 258, 111, 112, 112, 112, 112, 112, 112, 112,
112, 112, 112, 112, 113, 112, 117, 118, 115, 119,
234, 112, 266, 112, 121, 174, 120, 153, 122, 271,
134, 154, 123, 135, 136, 155, 138, 139, 140, 175,
269, 124, 141, 270, 125, 214, 272, 137, 142, 215,
- 112, 112, 112, 466, 112, 121, 174, 464, 153, 122,
+ 112, 112, 112, 740, 112, 121, 174, 1302, 153, 122,
271, 134, 154, 123, 135, 136, 155, 138, 139, 140,
175, 269, 124, 141, 270, 125, 214, 272, 137, 142,
215, 112, 112, 112, 112, 112, 112, 112, 112, 126,
- 286, 127, 143, 634, 128, 129, 144, 287, 130, 302,
- 145, 131, 283, 146, 132, 133, 147, 149, 241, 148,
- 283, 150, 242, 471, 471, 151, 280, 472, 472, 277,
+ 286, 127, 143, 1231, 128, 129, 144, 287, 130, 740,
+ 145, 131, 740, 146, 132, 133, 147, 149, 241, 148,
+ 466, 150, 242, 473, 473, 151, 463, 474, 474, 750,
126, 286, 127, 143, 152, 128, 129, 144, 287, 130,
288, 145, 131, 288, 146, 132, 133, 147, 149, 241,
148, 156, 150, 242, 169, 163, 151, 164, 170, 165,
157, 158, 171, 166, 243, 152, 167, 159, 292, 176,
- 177, 293, 168, 294, 172, 466, 295, 178, 173, 179,
- 244, 180, 156, 288, 181, 169, 163, 697, 164, 170,
- 165, 157, 158, 171, 166, 243, 464, 167, 159, 292,
+ 177, 293, 168, 294, 172, 740, 295, 178, 173, 179,
+ 244, 180, 156, 288, 181, 169, 163, 464, 164, 170,
+ 165, 157, 158, 171, 166, 243, 466, 167, 159, 292,
176, 177, 293, 168, 294, 172, 245, 295, 178, 173,
179, 244, 180, 182, 189, 181, 246, 183, 190, 247,
- 312, 184, 191, 208, 185, 317, 320, 186, 192, 462,
- 187, 464, 209, 225, 210, 311, 311, 245, 211, 225,
- 212, 697, 213, 223, 182, 189, 323, 246, 183, 190,
+ 312, 184, 191, 208, 185, 317, 320, 186, 192, 463,
+ 187, 465, 209, 637, 210, 311, 311, 245, 211, 302,
+ 212, 467, 213, 283, 182, 189, 323, 246, 183, 190,
247, 312, 184, 191, 208, 185, 317, 320, 186, 192,
255, 187, 193, 209, 194, 210, 202, 195, 196, 211,
- 203, 212, 197, 213, 204, 256, 198, 323, 302, 199,
- 205, 200, 466, 206, 201, 235, 106, 232, 232, 301,
- 207, 255, 510, 193, 280, 194, 236, 202, 195, 196,
- 248, 203, 519, 197, 249, 204, 256, 198, 106, 227,
+ 203, 212, 197, 213, 204, 256, 198, 323, 283, 199,
+ 205, 200, 468, 206, 201, 235, 280, 232, 232, 301,
+ 207, 255, 464, 193, 273, 194, 236, 202, 195, 196,
+ 248, 203, 522, 197, 249, 204, 256, 198, 700, 227,
199, 205, 200, 259, 206, 201, 216, 217, 250, 262,
218, 207, 219, 260, 220, 252, 267, 236, 261, 221,
- 268, 248, 318, 253, 263, 249, 291, 264, 265, 321,
- 227, 290, 254, 319, 259, 322, 283, 216, 217, 250,
- 262, 218, 283, 219, 260, 220, 252, 267, 281, 261,
+ 268, 248, 318, 253, 263, 249, 465, 264, 265, 321,
+ 227, 277, 254, 319, 259, 322, 462, 216, 217, 250,
+ 262, 218, 465, 219, 260, 220, 252, 267, 225, 261,
221, 268, 274, 318, 253, 263, 296, 296, 264, 265,
321, 275, 324, 254, 319, 297, 322, 276, 116, 326,
108, 108, 110, 110, 327, 328, 325, 277, 334, 117,
- 335, 111, 263, 274, 298, 298, 308, 308, 516, 516,
- 311, 311, 275, 324, 240, 309, 297, 230, 276, 336,
- 326, 468, 468, 337, 338, 327, 328, 325, 229, 334,
+ 335, 111, 225, 274, 298, 298, 308, 308, 519, 519,
+ 311, 311, 275, 324, 223, 309, 297, 302, 276, 336,
+ 326, 470, 470, 337, 338, 327, 328, 325, 106, 334,
117, 335, 111, 301, 301, 301, 301, 301, 301, 301,
- 301, 301, 301, 301, 301, 301, 309, 329, 304, 228,
+ 301, 301, 301, 301, 301, 301, 309, 329, 304, 106,
336, 301, 313, 301, 337, 338, 314, 331, 332, 333,
339, 340, 344, 315, 342, 343, 345, 330, 347, 316,
346, 350, 348, 351, 356, 341, 349, 357, 329, 358,
- 301, 301, 301, 313, 301, 468, 468, 314, 331, 332,
+ 301, 301, 301, 313, 301, 470, 470, 314, 331, 332,
333, 339, 340, 344, 315, 342, 343, 345, 330, 347,
- 316, 346, 350, 348, 351, 356, 341, 349, 357, 227,
+ 316, 346, 350, 348, 351, 356, 341, 349, 357, 291,
358, 301, 301, 301, 301, 301, 301, 301, 301, 305,
305, 301, 305, 305, 305, 305, 305, 305, 305, 305,
- 305, 305, 359, 363, 307, 472, 472, 305, 352, 305,
+ 305, 305, 359, 363, 307, 474, 474, 305, 352, 305,
353, 354, 360, 364, 355, 365, 366, 367, 368, 369,
- 361, 372, 373, 374, 370, 376, 362, 472, 472, 384,
- 375, 395, 226, 359, 363, 371, 305, 305, 305, 352,
+ 361, 372, 373, 374, 370, 376, 362, 474, 474, 384,
+ 375, 395, 290, 359, 363, 371, 305, 305, 305, 352,
305, 353, 354, 360, 364, 355, 365, 366, 367, 368,
369, 361, 372, 373, 374, 370, 376, 362, 381, 377,
@@ -1363,350 +1366,346 @@ static const flex_int16_t yy_nxt[4072] =
377, 398, 400, 394, 382, 383, 389, 401, 402, 403,
404, 405, 406, 407, 409, 408, 378, 385, 379, 386,
387, 396, 390, 380, 397, 388, 391, 392, 393, 399,
- 410, 411, 398, 400, 394, 417, 426, 225, 401, 402,
+ 410, 411, 398, 400, 394, 417, 426, 283, 401, 402,
403, 404, 405, 406, 407, 409, 408, 412, 415, 427,
413, 418, 428, 429, 416, 430, 419, 414, 420, 421,
- 223, 410, 411, 434, 422, 435, 417, 426, 423, 424,
- 438, 425, 439, 106, 436, 440, 516, 516, 412, 415,
+ 283, 410, 411, 434, 422, 435, 417, 426, 423, 424,
+ 438, 425, 439, 281, 436, 440, 519, 519, 412, 415,
427, 413, 418, 428, 429, 416, 430, 419, 414, 420,
421, 431, 432, 446, 434, 422, 435, 441, 437, 423,
424, 438, 425, 439, 433, 436, 440, 443, 442, 444,
447, 450, 451, 452, 453, 445, 454, 455, 448, 456,
457, 458, 431, 432, 446, 459, 460, 461, 441, 437,
- 449, 1736, 510, 229, 735, 433, 473, 1736, 443, 442,
+ 449, 263, 512, 229, 513, 433, 475, 240, 443, 442,
444, 447, 450, 451, 452, 453, 445, 454, 455, 448,
- 456, 457, 458, 233, 233, 474, 459, 460, 461, 233,
- 233, 449, 234, 235, 229, 232, 232, 473, 234, 469,
- 469, 475, 476, 479, 236, 477, 478, 480, 470, 481,
- 483, 484, 485, 486, 487, 488, 474, 492, 493, 489,
- 494, 495, 482, 234, 490, 496, 497, 498, 499, 234,
- 491, 500, 475, 476, 479, 236, 477, 478, 480, 470,
- 481, 483, 484, 485, 486, 487, 488, 503, 492, 493,
- 489, 494, 495, 482, 504, 490, 496, 497, 498, 499,
- 505, 491, 500, 501, 506, 502, 1736, 508, 512, 507,
- 521, 521, 514, 1736, 522, 522, 522, 522, 503, 1736,
-
- 296, 296, 522, 522, 515, 504, 517, 518, 277, 297,
- 1736, 505, 277, 523, 501, 506, 502, 277, 508, 512,
- 507, 104, 104, 514, 104, 104, 104, 104, 104, 104,
- 104, 104, 104, 104, 343, 515, 524, 517, 518, 104,
- 297, 104, 308, 308, 523, 525, 526, 527, 528, 529,
- 530, 309, 513, 531, 532, 533, 534, 535, 536, 537,
- 538, 539, 540, 541, 542, 343, 543, 524, 104, 104,
- 104, 1736, 104, 699, 699, 1736, 525, 526, 527, 528,
- 529, 530, 309, 513, 531, 532, 533, 534, 535, 536,
- 537, 538, 539, 540, 541, 542, 1736, 543, 547, 104,
+ 456, 457, 458, 233, 233, 476, 459, 460, 461, 233,
+ 233, 449, 234, 235, 229, 232, 232, 475, 234, 471,
+ 471, 477, 478, 481, 236, 479, 480, 482, 472, 483,
+ 485, 486, 487, 488, 489, 490, 476, 494, 495, 491,
+ 496, 497, 484, 234, 492, 498, 499, 500, 501, 234,
+ 493, 502, 477, 478, 481, 236, 479, 480, 482, 472,
+ 483, 485, 486, 487, 488, 489, 490, 505, 494, 495,
+ 491, 496, 497, 484, 506, 492, 498, 499, 500, 501,
+ 507, 493, 502, 503, 508, 504, 230, 510, 515, 509,
+ 524, 524, 517, 229, 525, 525, 228, 512, 505, 739,
+
+ 296, 296, 525, 525, 518, 506, 520, 521, 277, 297,
+ 227, 507, 277, 526, 503, 508, 504, 277, 510, 515,
+ 509, 104, 104, 517, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 343, 518, 527, 520, 521, 104,
+ 297, 104, 308, 308, 526, 528, 529, 530, 531, 532,
+ 533, 309, 516, 534, 535, 536, 537, 538, 539, 540,
+ 541, 542, 543, 544, 545, 343, 546, 527, 104, 104,
+ 104, 226, 104, 525, 525, 225, 528, 529, 530, 531,
+ 532, 533, 309, 516, 534, 535, 536, 537, 538, 539,
+ 540, 541, 542, 543, 544, 545, 223, 546, 550, 104,
104, 104, 104, 104, 104, 104, 104, 301, 301, 301,
301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
- 544, 548, 304, 699, 699, 301, 549, 301, 545, 547,
- 551, 552, 553, 554, 546, 555, 556, 557, 558, 559,
- 560, 561, 562, 550, 564, 565, 566, 567, 570, 571,
- 563, 544, 548, 572, 301, 301, 301, 549, 301, 545,
- 1736, 551, 552, 553, 554, 546, 555, 556, 557, 558,
- 559, 560, 561, 562, 550, 564, 565, 566, 567, 570,
- 571, 563, 1736, 573, 572, 301, 301, 301, 301, 301,
+ 547, 551, 304, 703, 703, 301, 552, 301, 548, 550,
+ 554, 555, 556, 557, 549, 558, 559, 560, 561, 562,
+ 563, 564, 565, 553, 567, 568, 569, 570, 573, 574,
+ 566, 547, 551, 575, 301, 301, 301, 552, 301, 548,
+ 106, 554, 555, 556, 557, 549, 558, 559, 560, 561,
+ 562, 563, 564, 565, 553, 567, 568, 569, 570, 573,
+ 574, 566, 1744, 576, 575, 301, 301, 301, 301, 301,
301, 301, 301, 305, 305, 301, 305, 305, 305, 305,
- 305, 305, 305, 305, 305, 305, 568, 574, 307, 277,
- 945, 305, 575, 305, 573, 576, 569, 577, 578, 579,
- 580, 582, 583, 584, 581, 585, 586, 587, 590, 588,
- 591, 592, 593, 594, 595, 596, 597, 568, 574, 589,
- 305, 305, 305, 575, 305, 1736, 576, 569, 577, 578,
- 579, 580, 582, 583, 584, 581, 585, 586, 587, 590,
- 588, 591, 592, 593, 594, 595, 596, 597, 1736, 598,
- 589, 305, 305, 305, 305, 305, 305, 305, 305, 104,
- 104, 599, 104, 104, 104, 104, 104, 104, 104, 104,
- 104, 104, 600, 612, 613, 277, 1135, 104, 614, 104,
-
- 598, 615, 616, 626, 627, 628, 629, 630, 520, 631,
- 632, 633, 599, 635, 636, 637, 639, 640, 641, 638,
- 1736, 644, 645, 600, 612, 613, 104, 104, 104, 614,
- 104, 1736, 615, 616, 626, 627, 628, 629, 630, 520,
- 631, 632, 633, 642, 635, 636, 637, 639, 640, 641,
- 638, 643, 644, 645, 646, 650, 1736, 104, 104, 104,
- 104, 104, 104, 104, 104, 601, 602, 1736, 603, 648,
- 604, 605, 653, 606, 642, 654, 607, 655, 647, 608,
- 649, 656, 643, 609, 610, 646, 650, 611, 1736, 1736,
- 657, 1736, 658, 1736, 1736, 659, 601, 602, 651, 603,
-
- 648, 604, 605, 653, 606, 652, 654, 607, 655, 647,
- 608, 649, 656, 660, 609, 610, 661, 662, 611, 617,
- 618, 657, 619, 658, 620, 621, 659, 622, 663, 651,
- 664, 665, 668, 666, 669, 670, 652, 623, 624, 671,
- 672, 625, 673, 674, 660, 667, 675, 661, 662, 676,
- 617, 618, 677, 619, 678, 620, 621, 679, 622, 663,
- 680, 664, 665, 668, 666, 669, 670, 681, 623, 624,
- 671, 672, 625, 673, 674, 682, 667, 675, 683, 684,
- 676, 685, 686, 677, 687, 678, 691, 689, 679, 688,
- 692, 680, 690, 694, 695, 696, 469, 469, 681, 698,
-
- 698, 700, 693, 699, 699, 470, 682, 701, 702, 683,
- 684, 703, 685, 686, 704, 687, 705, 691, 689, 706,
- 688, 692, 707, 690, 694, 695, 696, 708, 709, 710,
- 711, 712, 700, 693, 713, 714, 470, 715, 701, 702,
- 716, 717, 703, 718, 719, 704, 720, 705, 721, 722,
- 706, 723, 724, 707, 725, 726, 727, 728, 708, 709,
- 710, 711, 712, 729, 730, 713, 714, 731, 715, 732,
- 1736, 716, 717, 734, 718, 719, 733, 720, 277, 721,
- 722, 511, 723, 724, 736, 725, 726, 727, 728, 277,
- 737, 738, 739, 511, 729, 730, 740, 741, 731, 742,
-
- 732, 277, 743, 744, 734, 746, 747, 733, 748, 749,
- 750, 751, 511, 752, 753, 736, 754, 756, 757, 758,
- 759, 737, 738, 739, 511, 762, 763, 740, 741, 760,
- 742, 764, 765, 743, 744, 755, 746, 747, 761, 748,
- 749, 750, 751, 766, 752, 753, 767, 754, 756, 757,
- 758, 759, 768, 769, 770, 771, 762, 763, 772, 773,
- 760, 774, 764, 765, 775, 776, 755, 777, 778, 761,
- 779, 780, 781, 782, 766, 783, 784, 767, 785, 786,
- 787, 788, 789, 768, 769, 770, 771, 790, 791, 772,
- 773, 792, 774, 793, 794, 775, 776, 795, 777, 778,
-
- 796, 779, 780, 781, 782, 797, 783, 784, 798, 785,
- 786, 787, 788, 789, 799, 800, 801, 802, 790, 791,
- 803, 806, 792, 804, 793, 794, 807, 808, 795, 809,
- 805, 796, 810, 811, 812, 813, 797, 815, 816, 798,
- 817, 818, 814, 819, 820, 799, 800, 801, 802, 821,
- 822, 803, 806, 823, 804, 827, 828, 807, 808, 829,
- 809, 805, 830, 810, 811, 812, 813, 831, 815, 816,
- 824, 817, 818, 814, 819, 820, 825, 832, 833, 834,
- 821, 822, 835, 836, 823, 837, 827, 828, 826, 838,
- 829, 839, 843, 830, 840, 844, 845, 846, 831, 847,
-
- 841, 824, 848, 849, 852, 853, 854, 825, 832, 833,
- 834, 850, 842, 835, 836, 851, 837, 855, 856, 826,
- 838, 857, 839, 843, 858, 840, 844, 845, 846, 859,
- 847, 841, 860, 848, 849, 852, 853, 854, 861, 862,
- 863, 864, 850, 842, 865, 866, 851, 869, 855, 856,
- 870, 867, 857, 871, 872, 858, 868, 873, 874, 875,
- 859, 876, 877, 860, 878, 879, 880, 881, 882, 861,
- 862, 863, 864, 883, 884, 865, 866, 885, 869, 886,
- 887, 870, 867, 888, 871, 872, 889, 868, 873, 874,
- 875, 890, 876, 877, 891, 878, 879, 880, 881, 882,
-
- 892, 893, 894, 895, 883, 884, 898, 900, 885, 896,
- 886, 887, 901, 897, 888, 902, 899, 889, 903, 904,
- 905, 906, 890, 907, 908, 891, 909, 910, 911, 912,
- 913, 892, 893, 894, 895, 914, 915, 898, 900, 916,
- 896, 917, 918, 901, 897, 919, 902, 899, 920, 903,
- 904, 905, 906, 921, 907, 908, 922, 909, 910, 911,
- 912, 913, 923, 924, 925, 926, 914, 915, 927, 928,
- 916, 929, 917, 918, 930, 931, 919, 932, 933, 920,
- 934, 935, 936, 937, 921, 938, 939, 922, 940, 941,
- 942, 943, 1736, 923, 924, 925, 926, 944, 947, 927,
-
- 928, 948, 929, 949, 950, 930, 931, 951, 932, 933,
- 946, 934, 935, 936, 937, 952, 938, 939, 953, 940,
- 941, 942, 943, 277, 954, 277, 955, 956, 944, 947,
- 957, 958, 948, 959, 949, 950, 960, 961, 951, 962,
- 963, 946, 964, 965, 966, 968, 952, 967, 969, 953,
- 970, 971, 972, 973, 974, 954, 975, 955, 956, 976,
- 977, 957, 958, 980, 959, 978, 979, 960, 961, 981,
- 962, 963, 982, 964, 965, 966, 968, 983, 967, 969,
- 984, 970, 971, 972, 973, 974, 985, 975, 986, 987,
- 976, 977, 988, 989, 980, 990, 978, 979, 991, 992,
-
- 981, 1736, 1736, 982, 998, 999, 1000, 1001, 983, 1002,
- 1003, 984, 1004, 1005, 1006, 993, 1736, 985, 1012, 986,
- 987, 1013, 1736, 988, 989, 994, 990, 1014, 995, 991,
- 992, 1736, 996, 997, 1015, 998, 999, 1000, 1001, 1016,
- 1002, 1003, 1017, 1004, 1005, 1006, 993, 1007, 1018, 1012,
- 1008, 1019, 1013, 1009, 1020, 1021, 994, 1010, 1014, 995,
- 1022, 1023, 1011, 996, 997, 1015, 1024, 1025, 1026, 1027,
- 1016, 1028, 1029, 1017, 1030, 1031, 1032, 1033, 1007, 1018,
- 1034, 1008, 1019, 1035, 1009, 1020, 1021, 1036, 1010, 1037,
- 1038, 1022, 1023, 1011, 1039, 1040, 1041, 1024, 1025, 1026,
-
- 1027, 1042, 1028, 1029, 1043, 1030, 1031, 1032, 1033, 1044,
- 1045, 1034, 1046, 1047, 1035, 1048, 1049, 1050, 1036, 1051,
- 1037, 1038, 1052, 1053, 1054, 1039, 1040, 1041, 1055, 1056,
- 1057, 1058, 1042, 1059, 1060, 1043, 1061, 1062, 1063, 1064,
- 1044, 1045, 1065, 1046, 1047, 1068, 1048, 1049, 1050, 1066,
- 1051, 1069, 1070, 1052, 1053, 1054, 1071, 1074, 1067, 1055,
- 1056, 1057, 1058, 1075, 1059, 1060, 1076, 1061, 1062, 1063,
- 1064, 1072, 1077, 1065, 1078, 1079, 1068, 1080, 1073, 1081,
- 1066, 1085, 1069, 1070, 1086, 1087, 1088, 1071, 1074, 1067,
- 1089, 1090, 1091, 1082, 1075, 1083, 1092, 1076, 1093, 1094,
-
- 1095, 1096, 1072, 1077, 1099, 1078, 1079, 1097, 1080, 1073,
- 1081, 1084, 1085, 1098, 1100, 1086, 1087, 1088, 1101, 1103,
- 1104, 1089, 1090, 1091, 1082, 1105, 1083, 1092, 1102, 1093,
- 1094, 1095, 1096, 1106, 1107, 1099, 1108, 1109, 1097, 1110,
- 1111, 1112, 1084, 1113, 1098, 1100, 1114, 1115, 1116, 1101,
- 1103, 1104, 1117, 1118, 1119, 1120, 1105, 1121, 1122, 1102,
- 1123, 1124, 1125, 1126, 1106, 1107, 1127, 1108, 1109, 1128,
- 1110, 1111, 1112, 1129, 1113, 1130, 1131, 1114, 1115, 1116,
- 1132, 1133, 1134, 1117, 1118, 1119, 1120, 1138, 1121, 1122,
- 1136, 1123, 1124, 1125, 1126, 1137, 1139, 1127, 1140, 1141,
-
- 1128, 1142, 1143, 1144, 1129, 1145, 1130, 1131, 1146, 1147,
- 1148, 1132, 1133, 1134, 1149, 1150, 277, 1151, 1138, 277,
- 1152, 1136, 1153, 1154, 1155, 1156, 1137, 1139, 1157, 1140,
- 1141, 1158, 1142, 1143, 1144, 1159, 1145, 1160, 1161, 1146,
- 1147, 1148, 1162, 1163, 1164, 1149, 1150, 1165, 1151, 1166,
- 1167, 1152, 1168, 1153, 1154, 1155, 1156, 1169, 1170, 1157,
- 1171, 1172, 1158, 1173, 1174, 1175, 1159, 1176, 1160, 1161,
- 1177, 1178, 1179, 1162, 1163, 1164, 1180, 1181, 1165, 1182,
- 1166, 1167, 1183, 1168, 1184, 1185, 1186, 1189, 1169, 1170,
- 1190, 1171, 1172, 1191, 1173, 1174, 1175, 1187, 1176, 1192,
-
- 1193, 1177, 1178, 1179, 1194, 1188, 1195, 1180, 1181, 1196,
- 1182, 1197, 1198, 1183, 1199, 1184, 1185, 1186, 1189, 1200,
- 1201, 1190, 1202, 1203, 1191, 1204, 1205, 1206, 1187, 1207,
- 1192, 1193, 1208, 1209, 1210, 1194, 1188, 1195, 1211, 1212,
- 1196, 1213, 1197, 1198, 1214, 1199, 1215, 1216, 1217, 1218,
- 1200, 1201, 1219, 1202, 1203, 1220, 1204, 1205, 1206, 1221,
- 1207, 1222, 1224, 1208, 1209, 1210, 1225, 1226, 1227, 1211,
- 1212, 1228, 1213, 1229, 1230, 1214, 1231, 1215, 1216, 1217,
- 1218, 1232, 1233, 1219, 1234, 1235, 1220, 1236, 1237, 1238,
- 1221, 1239, 1222, 1224, 1240, 1241, 1242, 1225, 1226, 1227,
-
- 1243, 1244, 1228, 1245, 1229, 1230, 1246, 1231, 1247, 1248,
- 1249, 1250, 1232, 1233, 1251, 1234, 1235, 1252, 1236, 1237,
- 1238, 1255, 1239, 1256, 1257, 1240, 1241, 1242, 1253, 1258,
- 1259, 1243, 1244, 1260, 1245, 1261, 1262, 1246, 1263, 1247,
- 1248, 1249, 1250, 1264, 1254, 1251, 1265, 1266, 1252, 1267,
- 1268, 1269, 1255, 1270, 1256, 1257, 1271, 1272, 1273, 1253,
- 1258, 1259, 1274, 1275, 1260, 1276, 1261, 1262, 1277, 1263,
- 1278, 1279, 1280, 1281, 1264, 1254, 1282, 1265, 1266, 1283,
- 1267, 1268, 1269, 1284, 1270, 1285, 1286, 1271, 1272, 1273,
- 1287, 1288, 1289, 1274, 1275, 1290, 1276, 1291, 1292, 1277,
-
- 1295, 1278, 1279, 1280, 1281, 1296, 1293, 1282, 1297, 1298,
- 1283, 1299, 1300, 1301, 1284, 1302, 1285, 1286, 1303, 1304,
- 1305, 1287, 1288, 1289, 277, 1306, 1290, 1307, 1291, 1292,
- 277, 1295, 1308, 1309, 1310, 1311, 1296, 1293, 1312, 1297,
- 1298, 1313, 1299, 1300, 1301, 1314, 1302, 1315, 1316, 1303,
- 1304, 1305, 1317, 1318, 1319, 1320, 1306, 1321, 1307, 1322,
- 1323, 1324, 1325, 1308, 1309, 1310, 1311, 1326, 1327, 1312,
- 1328, 1329, 1313, 1330, 1331, 1332, 1314, 1333, 1315, 1316,
- 1334, 1335, 1336, 1317, 1318, 1319, 1320, 1337, 1321, 1338,
- 1322, 1323, 1324, 1325, 1339, 1340, 1341, 1342, 1326, 1327,
-
- 1343, 1328, 1329, 1344, 1330, 1331, 1332, 1345, 1333, 1346,
- 1347, 1334, 1335, 1336, 1348, 1349, 1350, 1351, 1337, 1352,
- 1338, 1353, 1354, 1355, 1356, 1339, 1340, 1341, 1342, 1357,
- 1358, 1343, 1359, 1360, 1344, 1361, 1362, 1363, 1345, 1364,
- 1346, 1347, 1365, 1367, 1366, 1348, 1349, 1350, 1351, 1368,
- 1352, 1370, 1353, 1354, 1355, 1356, 1371, 1372, 1373, 1374,
- 1357, 1358, 1375, 1359, 1360, 1376, 1361, 1362, 1363, 1369,
- 1364, 1377, 1378, 1365, 1367, 1366, 1379, 1380, 1381, 1382,
- 1368, 1383, 1370, 1384, 1385, 1386, 1387, 1371, 1372, 1373,
- 1374, 1388, 1389, 1375, 1390, 1391, 1376, 1392, 1393, 1394,
-
- 1369, 1395, 1377, 1378, 1396, 1397, 1400, 1379, 1380, 1381,
- 1382, 1398, 1383, 1399, 1384, 1385, 1386, 1387, 1401, 1402,
- 1403, 1404, 1388, 1389, 1405, 1390, 1391, 1406, 1392, 1393,
- 1394, 1407, 1395, 1408, 1409, 1396, 1397, 1400, 1410, 1411,
- 1412, 1413, 1398, 1414, 1399, 1415, 1416, 1417, 1418, 1401,
- 1402, 1403, 1404, 1419, 1420, 1405, 1421, 1422, 1406, 1423,
- 1736, 1426, 1407, 1425, 1408, 1409, 1427, 1424, 1428, 1410,
- 1411, 1412, 1413, 1429, 1414, 1430, 1415, 1416, 1417, 1418,
- 277, 1431, 1432, 1433, 1419, 1420, 1434, 1421, 1422, 1435,
- 1423, 277, 1426, 1436, 1425, 1437, 1438, 1427, 1424, 1428,
-
- 1439, 1440, 1441, 1442, 1429, 1443, 1430, 1444, 1445, 1446,
- 1447, 1448, 1431, 1432, 1433, 1449, 1450, 1434, 1451, 1452,
- 1435, 1453, 1454, 1455, 1436, 1456, 1437, 1438, 1457, 1458,
- 1459, 1439, 1440, 1441, 1442, 1460, 1443, 1461, 1444, 1445,
- 1446, 1447, 1448, 1462, 1463, 1464, 1449, 1450, 1465, 1451,
- 1452, 1466, 1453, 1454, 1455, 1467, 1456, 1468, 1469, 1457,
- 1458, 1459, 1470, 1471, 1472, 1473, 1460, 1474, 1461, 1475,
- 1476, 1477, 1478, 1479, 1462, 1463, 1464, 1480, 1481, 1465,
- 1482, 1483, 1466, 1484, 1485, 1486, 1467, 1487, 1468, 1469,
- 1488, 1489, 1490, 1470, 1471, 1472, 1473, 1491, 1474, 1492,
-
- 1475, 1476, 1477, 1478, 1479, 1493, 1494, 1495, 1480, 1481,
- 1496, 1482, 1483, 1497, 1484, 1485, 1486, 1498, 1487, 1499,
- 1500, 1488, 1489, 1490, 1501, 1502, 1503, 1504, 1491, 1505,
- 1492, 1506, 1507, 1508, 1509, 1510, 1493, 1494, 1495, 1511,
- 1512, 1496, 1513, 1514, 1497, 1515, 1516, 1517, 1498, 1518,
- 1499, 1500, 1519, 1520, 1521, 1501, 1502, 1503, 1504, 1522,
- 1505, 1523, 1506, 1507, 1508, 1509, 1510, 1524, 1527, 1525,
- 1511, 1512, 1526, 1513, 1514, 1528, 1515, 1516, 1517, 1529,
- 1518, 1530, 1531, 1519, 1520, 1521, 277, 1532, 1533, 277,
- 1522, 1534, 1523, 1535, 1536, 1537, 1538, 1539, 1524, 1527,
-
- 1525, 1540, 1541, 1526, 1542, 1543, 1528, 1544, 1545, 1546,
- 1529, 1547, 1530, 1531, 1548, 1549, 1550, 1551, 1532, 1533,
- 1552, 1553, 1534, 1554, 1535, 1536, 1537, 1538, 1539, 1555,
- 1556, 1557, 1540, 1541, 1558, 1542, 1543, 1559, 1544, 1545,
- 1546, 1560, 1547, 1561, 1562, 1548, 1549, 1550, 1551, 1563,
- 1564, 1552, 1553, 1565, 1554, 1566, 1567, 1568, 1569, 1570,
- 1555, 1556, 1557, 1571, 1572, 1558, 1573, 1574, 1559, 1575,
- 1576, 1577, 1560, 1578, 1561, 1562, 1579, 1580, 1581, 1582,
- 1563, 1564, 1583, 1584, 1565, 1585, 1566, 1567, 1568, 1569,
- 1570, 1586, 1587, 1588, 1571, 1572, 1589, 1573, 1574, 1590,
-
- 1575, 1576, 1577, 1591, 1578, 1592, 1593, 1579, 1580, 1581,
- 1582, 1594, 1595, 1583, 1584, 1596, 1585, 1597, 1598, 1599,
- 1600, 1601, 1586, 1587, 1588, 1602, 1605, 1589, 1603, 1604,
- 1590, 1606, 1607, 1608, 1591, 1610, 1592, 1593, 1609, 277,
- 1611, 1612, 1594, 1595, 1613, 277, 1596, 1614, 1597, 1598,
- 1599, 1600, 1601, 1615, 1616, 1617, 1602, 1605, 1618, 1603,
- 1604, 1619, 1606, 1607, 1608, 1620, 1610, 1621, 1622, 1609,
- 1623, 1611, 1612, 1624, 1625, 1613, 1626, 1627, 1614, 1628,
- 1629, 1630, 1631, 1632, 1615, 1616, 1617, 1633, 1634, 1618,
- 1635, 1636, 1619, 1637, 1638, 1639, 1620, 1640, 1621, 1622,
-
- 1641, 1623, 1642, 1643, 1624, 1625, 1644, 1626, 1627, 1645,
- 1628, 1629, 1630, 1631, 1632, 1646, 1647, 1648, 1633, 1634,
- 1649, 1635, 1636, 1650, 1637, 1638, 1639, 1653, 1640, 1651,
- 1652, 1641, 1654, 1642, 1643, 1655, 1656, 1644, 1657, 277,
- 1645, 1658, 1659, 1660, 1661, 1662, 1646, 1647, 1648, 1663,
- 277, 1649, 1664, 1665, 1650, 1666, 1667, 1668, 1653, 1669,
- 1651, 1652, 1670, 1654, 1671, 1672, 1655, 1656, 1673, 1657,
- 1674, 1675, 1658, 1659, 1660, 1661, 1662, 1676, 1677, 1678,
- 1663, 1679, 1680, 1664, 1665, 1681, 1666, 1667, 1668, 1682,
- 1669, 1683, 277, 1670, 1684, 1671, 1672, 1685, 1686, 1673,
-
- 1687, 1674, 1675, 1688, 1689, 277, 1690, 1691, 1676, 1677,
- 1678, 1692, 1679, 1680, 1693, 1694, 1681, 1695, 1696, 1697,
- 1682, 1698, 1683, 1699, 1700, 1684, 1701, 1702, 1685, 1686,
- 1703, 1687, 1704, 277, 1688, 1689, 1705, 1690, 1691, 1706,
- 1707, 1708, 1692, 1709, 1710, 1693, 1694, 1711, 1695, 1696,
- 1697, 1712, 1698, 1713, 1699, 1700, 277, 1701, 1702, 1714,
- 1715, 1703, 1716, 1704, 1717, 1719, 1720, 1705, 1721, 1722,
- 1706, 1707, 1708, 1723, 1709, 1710, 1724, 1725, 1711, 1727,
- 1728, 1729, 1712, 1730, 1713, 1731, 1732, 1733, 277, 1734,
- 1714, 1715, 1735, 1716, 1736, 1717, 1719, 1720, 1736, 1721,
-
- 1722, 1736, 1736, 1736, 1723, 1736, 1736, 1724, 1725, 1736,
- 1727, 1728, 1729, 1736, 1730, 1736, 1731, 1732, 1733, 1736,
- 1734, 1736, 1736, 1735, 87, 87, 87, 87, 87, 87,
- 87, 91, 91, 91, 91, 91, 91, 91, 95, 95,
- 95, 95, 95, 95, 95, 104, 1736, 104, 104, 104,
- 104, 104, 105, 1736, 105, 105, 105, 105, 105, 114,
- 114, 114, 114, 114, 114, 114, 222, 222, 222, 222,
- 222, 222, 222, 224, 1736, 224, 224, 224, 224, 224,
- 273, 273, 273, 273, 273, 273, 273, 278, 278, 278,
- 278, 278, 278, 278, 282, 282, 282, 282, 282, 282,
-
- 282, 284, 284, 284, 284, 284, 284, 284, 285, 285,
- 1736, 1736, 285, 285, 289, 1736, 289, 289, 1736, 289,
- 289, 301, 301, 301, 301, 301, 301, 301, 303, 303,
- 303, 303, 303, 303, 303, 306, 306, 306, 306, 306,
- 306, 306, 463, 463, 1736, 463, 463, 463, 463, 465,
- 465, 465, 1736, 465, 465, 465, 509, 509, 509, 509,
- 509, 509, 509, 511, 1736, 511, 511, 511, 511, 511,
- 305, 305, 305, 305, 305, 305, 305, 104, 1736, 104,
- 104, 104, 104, 104, 13, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
-
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736
+ 305, 305, 305, 305, 305, 305, 571, 577, 307, 703,
+ 703, 305, 578, 305, 576, 579, 572, 580, 581, 582,
+ 583, 585, 586, 587, 584, 588, 589, 590, 593, 591,
+ 594, 595, 596, 597, 598, 599, 600, 571, 577, 592,
+ 305, 305, 305, 578, 305, 1744, 579, 572, 580, 581,
+ 582, 583, 585, 586, 587, 584, 588, 589, 590, 593,
+ 591, 594, 595, 596, 597, 598, 599, 600, 1744, 601,
+ 592, 305, 305, 305, 305, 305, 305, 305, 305, 104,
+ 104, 602, 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 603, 615, 616, 277, 950, 104, 617, 104,
+
+ 601, 618, 619, 629, 630, 631, 632, 633, 523, 634,
+ 635, 636, 602, 638, 639, 640, 642, 643, 644, 641,
+ 1744, 647, 648, 603, 615, 616, 104, 104, 104, 617,
+ 104, 1744, 618, 619, 629, 630, 631, 632, 633, 523,
+ 634, 635, 636, 645, 638, 639, 640, 642, 643, 644,
+ 641, 646, 647, 648, 649, 653, 1744, 104, 104, 104,
+ 104, 104, 104, 104, 104, 604, 605, 1744, 606, 651,
+ 607, 608, 656, 609, 645, 657, 610, 658, 650, 611,
+ 652, 659, 646, 612, 613, 649, 653, 614, 1744, 952,
+ 660, 953, 661, 277, 1142, 662, 604, 605, 654, 606,
+
+ 651, 607, 608, 656, 609, 655, 657, 610, 658, 650,
+ 611, 652, 659, 663, 612, 613, 664, 665, 614, 620,
+ 621, 660, 622, 661, 623, 624, 662, 625, 666, 654,
+ 667, 668, 671, 669, 672, 673, 655, 626, 627, 674,
+ 675, 628, 676, 677, 663, 670, 678, 664, 665, 679,
+ 620, 621, 680, 622, 681, 623, 624, 682, 625, 666,
+ 683, 667, 668, 671, 669, 672, 673, 684, 626, 627,
+ 674, 675, 628, 676, 677, 685, 670, 678, 686, 687,
+ 679, 688, 689, 680, 690, 681, 694, 692, 682, 691,
+ 695, 683, 693, 697, 698, 699, 467, 701, 684, 471,
+
+ 471, 1744, 696, 704, 705, 706, 685, 1744, 472, 686,
+ 687, 707, 688, 689, 708, 690, 709, 694, 692, 710,
+ 691, 695, 711, 693, 697, 698, 699, 702, 702, 712,
+ 713, 703, 703, 696, 704, 705, 706, 468, 468, 472,
+ 714, 715, 707, 716, 717, 708, 718, 709, 719, 720,
+ 710, 721, 722, 711, 723, 724, 725, 726, 727, 728,
+ 712, 713, 729, 730, 731, 732, 733, 734, 735, 736,
+ 514, 714, 715, 1744, 716, 717, 741, 718, 277, 719,
+ 720, 738, 721, 722, 742, 723, 724, 725, 726, 727,
+ 728, 737, 743, 729, 730, 731, 732, 733, 734, 735,
+
+ 736, 514, 744, 514, 277, 745, 746, 741, 747, 277,
+ 748, 749, 738, 751, 752, 742, 753, 754, 755, 756,
+ 757, 758, 737, 743, 759, 761, 762, 763, 764, 765,
+ 767, 768, 769, 744, 514, 770, 745, 746, 766, 747,
+ 771, 748, 749, 760, 751, 752, 772, 753, 754, 755,
+ 756, 757, 758, 773, 774, 759, 761, 762, 763, 764,
+ 765, 767, 768, 769, 775, 776, 770, 777, 778, 766,
+ 779, 771, 780, 781, 760, 782, 783, 772, 784, 785,
+ 786, 787, 788, 789, 773, 774, 790, 791, 792, 793,
+ 794, 795, 796, 797, 798, 775, 776, 799, 777, 778,
+
+ 800, 779, 801, 780, 781, 802, 782, 783, 803, 784,
+ 785, 786, 787, 788, 789, 804, 805, 790, 791, 792,
+ 793, 794, 795, 796, 797, 798, 806, 807, 799, 808,
+ 809, 800, 811, 801, 812, 813, 802, 810, 814, 803,
+ 815, 816, 817, 818, 820, 821, 804, 805, 822, 823,
+ 819, 824, 825, 826, 827, 828, 1744, 806, 807, 832,
+ 808, 809, 1744, 811, 833, 812, 813, 834, 810, 814,
+ 835, 815, 816, 817, 818, 820, 821, 836, 837, 822,
+ 823, 819, 824, 825, 826, 827, 828, 829, 838, 839,
+ 832, 840, 841, 830, 842, 833, 843, 844, 834, 848,
+
+ 849, 835, 850, 851, 852, 831, 853, 854, 836, 837,
+ 855, 845, 857, 858, 856, 859, 860, 846, 829, 838,
+ 839, 861, 840, 841, 830, 842, 862, 843, 844, 847,
+ 848, 849, 863, 850, 851, 852, 831, 853, 854, 864,
+ 865, 855, 845, 857, 858, 856, 859, 860, 846, 866,
+ 867, 868, 861, 869, 870, 871, 872, 862, 874, 875,
+ 847, 873, 876, 863, 877, 878, 879, 880, 881, 882,
+ 864, 865, 883, 884, 885, 886, 887, 888, 889, 890,
+ 866, 867, 868, 891, 869, 870, 871, 872, 892, 874,
+ 875, 893, 873, 876, 894, 877, 878, 879, 880, 881,
+
+ 882, 895, 896, 883, 884, 885, 886, 887, 888, 889,
+ 890, 897, 898, 899, 891, 900, 901, 903, 905, 892,
+ 902, 906, 893, 907, 908, 894, 909, 904, 910, 911,
+ 912, 913, 895, 896, 914, 915, 916, 917, 918, 919,
+ 920, 921, 897, 898, 899, 922, 900, 901, 903, 905,
+ 923, 902, 906, 924, 907, 908, 925, 909, 904, 910,
+ 911, 912, 913, 926, 927, 914, 915, 916, 917, 918,
+ 919, 920, 921, 928, 929, 930, 922, 931, 932, 933,
+ 934, 923, 935, 936, 924, 937, 938, 925, 939, 940,
+ 941, 942, 943, 944, 926, 927, 945, 946, 947, 948,
+
+ 1744, 954, 951, 949, 928, 929, 930, 955, 931, 932,
+ 933, 934, 956, 935, 936, 277, 937, 938, 957, 939,
+ 940, 941, 942, 943, 944, 958, 959, 945, 946, 947,
+ 948, 277, 954, 951, 949, 960, 961, 962, 955, 963,
+ 964, 965, 966, 956, 967, 968, 970, 969, 971, 957,
+ 972, 973, 975, 976, 974, 977, 958, 959, 978, 979,
+ 980, 981, 982, 983, 984, 987, 960, 961, 962, 988,
+ 963, 964, 965, 966, 989, 967, 968, 970, 969, 971,
+ 990, 972, 973, 975, 976, 974, 977, 985, 986, 978,
+ 979, 980, 981, 982, 983, 984, 987, 991, 992, 993,
+
+ 988, 994, 995, 996, 997, 989, 998, 999, 1744, 1005,
+ 1006, 990, 1744, 1744, 1007, 1008, 1009, 1010, 985, 986,
+ 1011, 1012, 1013, 1019, 1020, 1744, 1000, 1021, 991, 992,
+ 993, 1744, 994, 995, 996, 997, 1001, 998, 999, 1002,
+ 1005, 1006, 1022, 1003, 1004, 1007, 1008, 1009, 1010, 1023,
+ 1024, 1011, 1012, 1013, 1019, 1020, 1014, 1000, 1021, 1015,
+ 1025, 1026, 1016, 1027, 1028, 1029, 1017, 1001, 1030, 1031,
+ 1002, 1018, 1032, 1022, 1003, 1004, 1033, 1034, 1035, 1036,
+ 1023, 1024, 1037, 1038, 1039, 1040, 1041, 1014, 1042, 1043,
+ 1015, 1025, 1026, 1016, 1027, 1028, 1029, 1017, 1044, 1030,
+
+ 1031, 1045, 1018, 1032, 1046, 1047, 1048, 1033, 1034, 1035,
+ 1036, 1049, 1050, 1037, 1038, 1039, 1040, 1041, 1051, 1042,
+ 1043, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1044,
+ 1060, 1061, 1045, 1062, 1063, 1046, 1047, 1048, 1064, 1065,
+ 1066, 1067, 1049, 1050, 1068, 1069, 1070, 1071, 1072, 1051,
+ 1075, 1073, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059,
+ 1074, 1060, 1061, 1076, 1062, 1063, 1077, 1078, 1081, 1064,
+ 1065, 1066, 1067, 1079, 1082, 1068, 1069, 1070, 1071, 1072,
+ 1080, 1075, 1073, 1083, 1084, 1085, 1086, 1087, 1088, 1092,
+ 1089, 1074, 1090, 1093, 1076, 1094, 1095, 1077, 1078, 1081,
+
+ 1096, 1097, 1098, 1099, 1079, 1082, 1100, 1101, 1091, 1102,
+ 1103, 1080, 1106, 1107, 1083, 1084, 1085, 1086, 1087, 1088,
+ 1092, 1089, 1104, 1090, 1093, 1108, 1094, 1095, 1105, 1110,
+ 1111, 1096, 1097, 1098, 1099, 1109, 1112, 1100, 1101, 1091,
+ 1102, 1103, 1113, 1106, 1107, 1114, 1115, 1116, 1117, 1118,
+ 1119, 1120, 1121, 1104, 1122, 1123, 1108, 1124, 1125, 1105,
+ 1110, 1111, 1126, 1127, 1128, 1129, 1109, 1112, 1130, 1131,
+ 1132, 1133, 1134, 1113, 1135, 1136, 1114, 1115, 1116, 1117,
+ 1118, 1119, 1120, 1121, 1137, 1122, 1123, 1138, 1124, 1125,
+ 1139, 1140, 1141, 1126, 1127, 1128, 1129, 1744, 1143, 1130,
+
+ 1131, 1132, 1133, 1134, 1144, 1135, 1136, 952, 1146, 1145,
+ 1147, 1148, 1149, 1150, 1151, 1137, 1152, 1153, 1138, 1154,
+ 1155, 1139, 1140, 1141, 277, 1156, 1157, 1158, 277, 1143,
+ 1159, 1160, 1161, 1162, 1163, 1144, 1164, 1165, 1166, 1146,
+ 1167, 1147, 1148, 1149, 1150, 1151, 1168, 1152, 1153, 1169,
+ 1154, 1155, 1170, 1171, 1172, 1173, 1156, 1157, 1158, 1174,
+ 1175, 1159, 1160, 1161, 1162, 1163, 1176, 1164, 1165, 1166,
+ 1177, 1167, 1178, 1179, 1180, 1181, 1182, 1168, 1183, 1184,
+ 1169, 1185, 1186, 1170, 1171, 1172, 1173, 1187, 1188, 1189,
+ 1174, 1175, 1190, 1191, 1192, 1193, 1194, 1176, 1197, 1198,
+
+ 1195, 1177, 1199, 1178, 1179, 1180, 1181, 1182, 1196, 1183,
+ 1184, 1200, 1185, 1186, 1201, 1202, 1203, 1204, 1187, 1188,
+ 1189, 1205, 1206, 1190, 1191, 1192, 1193, 1194, 1207, 1197,
+ 1198, 1195, 1208, 1199, 1209, 1210, 1211, 1212, 1213, 1196,
+ 1214, 1215, 1200, 1216, 1217, 1201, 1202, 1203, 1204, 1218,
+ 1219, 1220, 1205, 1206, 1221, 1222, 1223, 1224, 1225, 1207,
+ 1226, 1227, 1228, 1208, 1229, 1209, 1210, 1211, 1212, 1213,
+ 1230, 1214, 1215, 1232, 1216, 1217, 1233, 1234, 1235, 1236,
+ 1218, 1219, 1220, 1237, 1238, 1221, 1222, 1223, 1224, 1225,
+ 1239, 1226, 1227, 1228, 1240, 1229, 1241, 1242, 1243, 1244,
+
+ 1245, 1230, 1246, 1247, 1232, 1248, 1249, 1233, 1234, 1235,
+ 1236, 1250, 1251, 1252, 1237, 1238, 1253, 1254, 1255, 1256,
+ 1257, 1239, 1258, 1259, 1260, 1240, 1263, 1241, 1242, 1243,
+ 1244, 1245, 1264, 1246, 1247, 1265, 1248, 1249, 1266, 1267,
+ 1261, 1268, 1250, 1251, 1252, 1269, 1270, 1253, 1254, 1255,
+ 1256, 1257, 1271, 1258, 1259, 1260, 1262, 1263, 1272, 1273,
+ 1274, 1275, 1276, 1264, 1277, 1278, 1265, 1279, 1280, 1266,
+ 1267, 1261, 1268, 1281, 1282, 1283, 1269, 1270, 1284, 1285,
+ 1286, 1287, 1288, 1271, 1289, 1290, 1291, 1262, 1292, 1272,
+ 1273, 1274, 1275, 1276, 1293, 1277, 1278, 1294, 1279, 1280,
+
+ 1295, 1296, 1297, 1298, 1281, 1282, 1283, 1299, 1303, 1284,
+ 1285, 1286, 1287, 1288, 1300, 1289, 1290, 1291, 1301, 1292,
+ 1304, 1305, 1306, 1307, 1308, 1293, 1309, 1310, 1294, 1311,
+ 1312, 1295, 1296, 1297, 1298, 1313, 1314, 1315, 1299, 1303,
+ 277, 1316, 277, 1317, 1318, 1300, 1319, 1320, 1321, 1301,
+ 1322, 1304, 1305, 1306, 1307, 1308, 1323, 1309, 1310, 1324,
+ 1311, 1312, 1325, 1326, 1327, 1328, 1313, 1314, 1315, 1329,
+ 1330, 1331, 1316, 1332, 1317, 1318, 1333, 1319, 1320, 1321,
+ 1334, 1322, 1335, 1336, 1337, 1338, 1339, 1323, 1340, 1341,
+ 1324, 1342, 1343, 1325, 1326, 1327, 1328, 1344, 1345, 1346,
+
+ 1329, 1330, 1331, 1347, 1332, 1348, 1349, 1333, 1350, 1351,
+ 1352, 1334, 1353, 1335, 1336, 1337, 1338, 1339, 1354, 1340,
+ 1341, 1355, 1342, 1343, 1356, 1357, 1358, 1359, 1344, 1345,
+ 1346, 1360, 1361, 1362, 1347, 1363, 1348, 1349, 1364, 1350,
+ 1351, 1352, 1365, 1353, 1366, 1367, 1368, 1369, 1370, 1354,
+ 1371, 1372, 1355, 1375, 1376, 1356, 1357, 1358, 1359, 1373,
+ 1378, 1374, 1360, 1361, 1362, 1379, 1363, 1380, 1381, 1364,
+ 1382, 1383, 1384, 1365, 1377, 1366, 1367, 1368, 1369, 1370,
+ 1385, 1371, 1372, 1386, 1375, 1376, 1387, 1388, 1389, 1390,
+ 1373, 1378, 1374, 1391, 1392, 1393, 1379, 1394, 1380, 1381,
+
+ 1395, 1382, 1383, 1384, 1396, 1377, 1397, 1398, 1399, 1400,
+ 1401, 1385, 1402, 1403, 1386, 1404, 1405, 1387, 1388, 1389,
+ 1390, 1406, 1408, 1407, 1391, 1392, 1393, 1409, 1394, 1410,
+ 1411, 1395, 1412, 1413, 1414, 1396, 1415, 1397, 1398, 1399,
+ 1400, 1401, 1416, 1402, 1403, 1417, 1404, 1405, 1418, 1419,
+ 1420, 1421, 1406, 1408, 1407, 1422, 1423, 1424, 1409, 1425,
+ 1410, 1411, 1426, 1412, 1413, 1414, 1427, 1415, 1428, 1429,
+ 1430, 1431, 1432, 1416, 1433, 1434, 1417, 1435, 1436, 1418,
+ 1419, 1420, 1421, 1437, 1438, 1439, 1422, 1423, 1424, 1440,
+ 1425, 277, 1441, 1426, 1442, 1443, 277, 1427, 1444, 1428,
+
+ 1429, 1430, 1431, 1432, 1445, 1433, 1434, 1446, 1435, 1436,
+ 1447, 1448, 1449, 1450, 1437, 1438, 1439, 1451, 1452, 1453,
+ 1440, 1454, 1455, 1441, 1456, 1442, 1443, 1457, 1458, 1444,
+ 1459, 1460, 1461, 1462, 1463, 1445, 1464, 1465, 1446, 1466,
+ 1467, 1447, 1448, 1449, 1450, 1468, 1469, 1470, 1451, 1452,
+ 1453, 1471, 1454, 1455, 1472, 1456, 1473, 1474, 1457, 1458,
+ 1475, 1459, 1460, 1461, 1462, 1463, 1476, 1464, 1465, 1477,
+ 1466, 1467, 1478, 1479, 1480, 1481, 1468, 1469, 1470, 1482,
+ 1483, 1484, 1471, 1485, 1486, 1472, 1487, 1473, 1474, 1488,
+ 1489, 1475, 1490, 1491, 1492, 1493, 1494, 1476, 1495, 1496,
+
+ 1477, 1497, 1498, 1478, 1479, 1480, 1481, 1499, 1500, 1501,
+ 1482, 1483, 1484, 1502, 1485, 1486, 1503, 1487, 1504, 1505,
+ 1488, 1489, 1506, 1490, 1491, 1492, 1493, 1494, 1507, 1495,
+ 1496, 1508, 1497, 1498, 1509, 1510, 1511, 1512, 1499, 1500,
+ 1501, 1513, 1514, 1515, 1502, 1516, 1517, 1503, 1518, 1504,
+ 1505, 1519, 1520, 1506, 1521, 1522, 1523, 1524, 1525, 1507,
+ 1526, 1527, 1508, 1528, 1529, 1509, 1510, 1511, 1512, 1530,
+ 1531, 1532, 1513, 1514, 1515, 1535, 1516, 1517, 1536, 1518,
+ 1533, 1534, 1519, 1520, 1537, 1521, 1522, 1523, 1524, 1525,
+ 1538, 1526, 1527, 1539, 1528, 1529, 1540, 277, 277, 1541,
+
+ 1530, 1531, 1532, 1542, 1543, 1544, 1535, 1545, 1546, 1536,
+ 1547, 1533, 1534, 1548, 1549, 1537, 1550, 1551, 1552, 1553,
+ 1554, 1538, 1555, 1556, 1539, 1557, 1558, 1540, 1559, 1560,
+ 1541, 1561, 1562, 1563, 1542, 1543, 1544, 1564, 1545, 1546,
+ 1565, 1547, 1566, 1567, 1548, 1549, 1568, 1550, 1551, 1552,
+ 1553, 1554, 1569, 1555, 1556, 1570, 1557, 1558, 1571, 1559,
+ 1560, 1572, 1561, 1562, 1563, 1573, 1574, 1575, 1564, 1576,
+ 1577, 1565, 1578, 1566, 1567, 1579, 1580, 1568, 1581, 1582,
+ 1583, 1584, 1585, 1569, 1586, 1587, 1570, 1588, 1589, 1571,
+ 1590, 1591, 1572, 1592, 1593, 1594, 1573, 1574, 1575, 1595,
+
+ 1576, 1577, 1596, 1578, 1597, 1598, 1579, 1580, 1599, 1581,
+ 1582, 1583, 1584, 1585, 1600, 1586, 1587, 1601, 1588, 1589,
+ 1602, 1590, 1591, 1603, 1592, 1593, 1594, 1604, 1605, 1606,
+ 1595, 1607, 1608, 1596, 1609, 1597, 1598, 1610, 1611, 1599,
+ 1612, 1613, 1614, 1615, 1616, 1600, 1618, 1619, 1601, 1617,
+ 277, 1602, 1620, 1621, 1603, 277, 1622, 1623, 1604, 1605,
+ 1606, 1624, 1607, 1608, 1625, 1609, 1626, 1627, 1610, 1611,
+ 1628, 1612, 1613, 1614, 1615, 1616, 1629, 1618, 1619, 1630,
+ 1617, 1631, 1632, 1620, 1621, 1633, 1634, 1622, 1623, 1635,
+ 1636, 1637, 1624, 1638, 1639, 1625, 1640, 1626, 1627, 1641,
+
+ 1642, 1628, 1643, 1644, 1645, 1646, 1647, 1629, 1648, 1649,
+ 1630, 1650, 1631, 1632, 1651, 1652, 1633, 1634, 1653, 1654,
+ 1635, 1636, 1637, 1655, 1638, 1639, 1656, 1640, 1657, 1658,
+ 1641, 1642, 1660, 1643, 1644, 1645, 1646, 1647, 1659, 1648,
+ 1649, 1661, 1650, 1662, 1663, 1651, 1652, 1664, 277, 1653,
+ 1654, 1665, 277, 1666, 1655, 1667, 1668, 1656, 1669, 1657,
+ 1658, 1670, 1671, 1660, 1672, 1673, 1674, 1675, 1676, 1659,
+ 1677, 1678, 1661, 1679, 1662, 1663, 1680, 1681, 1664, 1682,
+ 1683, 1684, 1665, 1685, 1666, 1686, 1667, 1668, 1687, 1669,
+ 1688, 1690, 1670, 1671, 277, 1672, 1673, 1674, 1675, 1676,
+
+ 1689, 1677, 1678, 1691, 1679, 1692, 1693, 1680, 1681, 1694,
+ 1682, 1683, 1684, 1695, 1685, 1696, 1686, 1697, 1698, 1687,
+ 277, 1688, 1690, 1699, 1700, 1701, 1702, 1703, 1704, 1705,
+ 1706, 1689, 1707, 1708, 1691, 1709, 1692, 1693, 1710, 1711,
+ 1694, 1712, 277, 1713, 1695, 1714, 1696, 1715, 1697, 1698,
+ 1716, 1717, 1718, 1719, 1699, 1700, 1701, 1702, 1703, 1704,
+ 1705, 1706, 1720, 1707, 1708, 277, 1709, 1721, 1722, 1710,
+ 1711, 1723, 1712, 1724, 1713, 1727, 1714, 1725, 1715, 1728,
+ 1729, 1716, 1717, 1718, 1719, 1730, 1731, 1732, 1733, 1735,
+ 1736, 1737, 1738, 1720, 1739, 1740, 1741, 1742, 1721, 1722,
+
+ 1743, 277, 1723, 1744, 1724, 1744, 1727, 1744, 1725, 1744,
+ 1728, 1729, 1744, 1744, 1744, 1744, 1730, 1731, 1732, 1733,
+ 1735, 1736, 1737, 1738, 1744, 1739, 1740, 1741, 1742, 1744,
+ 1744, 1743, 87, 87, 87, 87, 87, 91, 91, 91,
+ 91, 91, 95, 95, 95, 95, 95, 104, 1744, 104,
+ 104, 104, 105, 1744, 105, 105, 105, 114, 114, 114,
+ 114, 114, 222, 222, 222, 222, 222, 224, 1744, 224,
+ 224, 224, 273, 273, 273, 273, 273, 278, 278, 278,
+ 278, 278, 282, 282, 282, 282, 282, 284, 284, 284,
+ 284, 284, 285, 285, 1744, 285, 285, 289, 1744, 289,
+
+ 1744, 289, 301, 301, 301, 301, 301, 303, 303, 303,
+ 303, 303, 306, 306, 306, 306, 306, 463, 463, 463,
+ 463, 463, 466, 466, 466, 466, 466, 511, 511, 511,
+ 511, 511, 514, 1744, 514, 514, 514, 305, 305, 305,
+ 305, 305, 104, 1744, 104, 104, 104, 740, 740, 740,
+ 740, 740, 13, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744
} ;
-static const flex_int16_t yy_chk[4072] =
+static const flex_int16_t yy_chk[4040] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1742,70 +1741,70 @@ static const flex_int16_t yy_chk[4072] =
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 21, 21, 1742, 34, 40, 69, 72, 34,
- 73, 21, 1717, 279, 23, 279, 23, 23, 234, 234,
- 60, 60, 234, 234, 1704, 23, 24, 1137, 24, 60,
- 1051, 77, 300, 300, 528, 24, 34, 40, 69, 72,
+ 11, 11, 21, 21, 1750, 34, 40, 69, 72, 34,
+ 73, 21, 1734, 279, 23, 279, 23, 23, 234, 234,
+ 60, 60, 234, 234, 1726, 23, 24, 1725, 24, 60,
+ 1712, 77, 300, 300, 1302, 24, 34, 40, 69, 72,
34, 73, 21, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 23, 24, 22, 24,
60, 22, 77, 22, 25, 37, 24, 31, 25, 80,
27, 31, 25, 27, 27, 31, 28, 28, 28, 37,
79, 25, 28, 79, 25, 45, 81, 27, 28, 45,
- 22, 22, 22, 465, 22, 25, 37, 463, 31, 25,
+ 22, 22, 22, 1145, 22, 25, 37, 1144, 31, 25,
80, 27, 31, 25, 27, 27, 31, 28, 28, 28,
37, 79, 25, 28, 79, 25, 45, 81, 27, 28,
45, 22, 22, 22, 22, 22, 22, 22, 22, 26,
- 92, 26, 29, 403, 26, 26, 29, 93, 26, 301,
- 29, 26, 284, 29, 26, 26, 29, 30, 65, 29,
- 282, 30, 65, 236, 236, 30, 278, 236, 236, 273,
+ 92, 26, 29, 1058, 26, 26, 29, 93, 26, 953,
+ 29, 26, 739, 29, 26, 26, 29, 30, 65, 29,
+ 701, 30, 65, 236, 236, 30, 700, 236, 236, 531,
26, 92, 26, 29, 30, 26, 26, 29, 93, 26,
94, 29, 26, 94, 29, 26, 26, 29, 30, 65,
29, 32, 30, 65, 36, 35, 30, 35, 36, 35,
32, 32, 36, 35, 66, 30, 35, 32, 99, 38,
- 38, 100, 35, 101, 36, 230, 102, 38, 36, 38,
- 66, 38, 32, 94, 38, 36, 35, 464, 35, 36,
- 35, 32, 32, 36, 35, 66, 228, 35, 32, 99,
+ 38, 100, 35, 101, 36, 513, 102, 38, 36, 38,
+ 66, 38, 32, 94, 38, 36, 35, 228, 35, 36,
+ 35, 32, 32, 36, 35, 66, 467, 35, 32, 99,
38, 38, 100, 35, 101, 36, 67, 102, 38, 36,
38, 66, 38, 39, 41, 38, 67, 39, 41, 67,
- 118, 39, 41, 44, 39, 120, 122, 39, 41, 226,
- 39, 464, 44, 225, 44, 310, 310, 67, 44, 224,
- 44, 466, 44, 222, 39, 41, 124, 67, 39, 41,
+ 118, 39, 41, 44, 39, 120, 122, 39, 41, 464,
+ 39, 228, 44, 403, 44, 310, 310, 67, 44, 301,
+ 44, 230, 44, 284, 39, 41, 124, 67, 39, 41,
67, 118, 39, 41, 44, 39, 120, 122, 39, 41,
71, 39, 42, 44, 42, 44, 43, 42, 42, 44,
- 43, 44, 42, 44, 43, 71, 42, 124, 112, 42,
- 43, 42, 466, 43, 42, 61, 106, 61, 61, 305,
- 43, 71, 509, 42, 509, 42, 61, 43, 42, 42,
- 68, 43, 305, 42, 68, 43, 71, 42, 105, 75,
+ 43, 44, 42, 44, 43, 71, 42, 124, 282, 42,
+ 43, 42, 230, 43, 42, 61, 278, 61, 61, 305,
+ 43, 71, 463, 42, 277, 42, 61, 43, 42, 42,
+ 68, 43, 305, 42, 68, 43, 71, 42, 465, 75,
42, 43, 42, 74, 43, 42, 46, 46, 68, 75,
46, 43, 46, 74, 46, 70, 78, 61, 74, 46,
- 78, 68, 121, 70, 76, 68, 98, 76, 76, 123,
- 75, 97, 70, 121, 74, 123, 90, 46, 46, 68,
- 75, 46, 89, 46, 74, 46, 70, 78, 85, 74,
+ 78, 68, 121, 70, 76, 68, 463, 76, 76, 123,
+ 75, 273, 70, 121, 74, 123, 226, 46, 46, 68,
+ 75, 46, 465, 46, 74, 46, 70, 78, 225, 74,
46, 78, 82, 121, 70, 76, 107, 107, 76, 76,
123, 82, 125, 70, 121, 107, 123, 82, 108, 127,
108, 108, 110, 110, 128, 129, 125, 82, 133, 108,
- 134, 110, 84, 82, 297, 297, 116, 116, 297, 297,
- 311, 311, 82, 125, 64, 116, 107, 58, 82, 136,
- 127, 467, 467, 136, 137, 128, 129, 125, 57, 133,
+ 134, 110, 224, 82, 297, 297, 116, 116, 297, 297,
+ 311, 311, 82, 125, 222, 116, 107, 112, 82, 136,
+ 127, 469, 469, 136, 137, 128, 129, 125, 106, 133,
108, 134, 110, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 116, 130, 114, 56,
+ 114, 114, 114, 114, 114, 114, 116, 130, 114, 105,
136, 114, 119, 114, 136, 137, 119, 131, 131, 131,
138, 139, 141, 119, 140, 140, 142, 130, 143, 119,
142, 145, 144, 146, 148, 139, 144, 149, 130, 150,
- 114, 114, 114, 119, 114, 468, 468, 119, 131, 131,
+ 114, 114, 114, 119, 114, 470, 470, 119, 131, 131,
131, 138, 139, 141, 119, 140, 140, 142, 130, 143,
- 119, 142, 145, 144, 146, 148, 139, 144, 149, 55,
+ 119, 142, 145, 144, 146, 148, 139, 144, 149, 98,
150, 114, 114, 114, 114, 114, 114, 114, 114, 115,
115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 151, 153, 115, 471, 471, 115, 147, 115,
+ 115, 115, 151, 153, 115, 473, 473, 115, 147, 115,
147, 147, 152, 154, 147, 155, 156, 157, 158, 158,
- 152, 159, 160, 161, 158, 162, 152, 472, 472, 166,
- 161, 172, 50, 151, 153, 158, 115, 115, 115, 147,
+ 152, 159, 160, 161, 158, 162, 152, 474, 474, 166,
+ 161, 172, 97, 151, 153, 158, 115, 115, 115, 147,
115, 147, 147, 152, 154, 147, 155, 156, 157, 158,
158, 152, 159, 160, 161, 158, 162, 152, 165, 163,
@@ -1815,18 +1814,18 @@ static const flex_int16_t yy_chk[4072] =
163, 174, 175, 171, 165, 165, 170, 176, 177, 178,
179, 180, 181, 182, 183, 182, 163, 169, 163, 169,
169, 173, 170, 163, 174, 169, 171, 171, 171, 175,
- 184, 185, 174, 175, 171, 188, 191, 49, 176, 177,
+ 184, 185, 174, 175, 171, 188, 191, 90, 176, 177,
178, 179, 180, 181, 182, 183, 182, 186, 187, 192,
186, 189, 193, 194, 187, 195, 189, 186, 190, 190,
- 48, 184, 185, 197, 190, 198, 188, 191, 190, 190,
- 200, 190, 201, 19, 199, 202, 516, 516, 186, 187,
+ 89, 184, 185, 197, 190, 198, 188, 191, 190, 190,
+ 200, 190, 201, 85, 199, 202, 519, 519, 186, 187,
192, 186, 189, 193, 194, 187, 195, 189, 186, 190,
190, 196, 196, 205, 197, 190, 198, 203, 199, 190,
190, 200, 190, 201, 196, 199, 202, 204, 203, 204,
206, 207, 210, 212, 213, 204, 214, 215, 206, 216,
217, 218, 196, 196, 205, 219, 220, 221, 203, 199,
- 206, 13, 510, 241, 510, 196, 242, 0, 204, 203,
+ 206, 84, 511, 241, 511, 196, 242, 64, 204, 203,
204, 206, 207, 210, 212, 213, 204, 214, 215, 206,
216, 217, 218, 231, 231, 243, 219, 220, 221, 233,
@@ -1837,33 +1836,33 @@ static const flex_int16_t yy_chk[4072] =
257, 268, 244, 245, 247, 232, 246, 246, 248, 235,
249, 250, 251, 252, 253, 254, 255, 270, 258, 259,
257, 260, 262, 249, 271, 257, 264, 265, 266, 267,
- 272, 257, 268, 269, 274, 269, 0, 276, 292, 275,
- 309, 309, 294, 0, 309, 309, 521, 521, 270, 0,
+ 272, 257, 268, 269, 274, 269, 58, 276, 292, 275,
+ 309, 309, 294, 57, 309, 309, 56, 512, 270, 512,
- 296, 296, 522, 522, 295, 271, 302, 304, 276, 296,
- 0, 272, 274, 312, 269, 274, 269, 275, 276, 292,
+ 296, 296, 524, 524, 295, 271, 302, 304, 276, 296,
+ 55, 272, 274, 312, 269, 274, 269, 275, 276, 292,
275, 291, 291, 294, 291, 291, 291, 291, 291, 291,
291, 291, 291, 291, 293, 295, 313, 302, 304, 291,
296, 291, 308, 308, 312, 314, 315, 316, 317, 318,
319, 308, 293, 320, 321, 322, 323, 324, 325, 326,
327, 328, 329, 330, 331, 293, 332, 313, 291, 291,
- 291, 0, 291, 698, 698, 0, 314, 315, 316, 317,
+ 291, 50, 291, 525, 525, 49, 314, 315, 316, 317,
318, 319, 308, 293, 320, 321, 322, 323, 324, 325,
- 326, 327, 328, 329, 330, 331, 0, 332, 335, 291,
+ 326, 327, 328, 329, 330, 331, 48, 332, 335, 291,
291, 291, 291, 291, 291, 291, 291, 303, 303, 303,
303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
- 333, 336, 303, 699, 699, 303, 337, 303, 333, 335,
+ 333, 336, 303, 702, 702, 303, 337, 303, 333, 335,
338, 339, 340, 341, 333, 342, 344, 345, 346, 347,
348, 349, 350, 337, 351, 352, 353, 354, 356, 358,
350, 333, 336, 359, 303, 303, 303, 337, 303, 333,
- 0, 338, 339, 340, 341, 333, 342, 344, 345, 346,
+ 19, 338, 339, 340, 341, 333, 342, 344, 345, 346,
347, 348, 349, 350, 337, 351, 352, 353, 354, 356,
- 358, 350, 0, 360, 359, 303, 303, 303, 303, 303,
+ 358, 350, 13, 360, 359, 303, 303, 303, 303, 303,
303, 303, 303, 306, 306, 306, 306, 306, 306, 306,
- 306, 306, 306, 306, 306, 306, 355, 361, 306, 733,
- 733, 306, 362, 306, 360, 363, 355, 364, 365, 367,
+ 306, 306, 306, 306, 306, 306, 355, 361, 306, 703,
+ 703, 306, 362, 306, 360, 363, 355, 364, 365, 367,
368, 369, 370, 371, 368, 372, 373, 374, 376, 375,
377, 378, 379, 380, 381, 382, 383, 355, 361, 375,
306, 306, 306, 362, 306, 0, 363, 355, 364, 365,
@@ -1871,7 +1870,7 @@ static const flex_int16_t yy_chk[4072] =
375, 377, 378, 379, 380, 381, 382, 383, 0, 384,
375, 306, 306, 306, 306, 306, 306, 306, 306, 307,
307, 386, 307, 307, 307, 307, 307, 307, 307, 307,
- 307, 307, 387, 389, 390, 944, 944, 307, 390, 307,
+ 307, 307, 387, 389, 390, 737, 737, 307, 390, 307,
384, 391, 392, 394, 395, 396, 397, 398, 307, 399,
400, 401, 386, 404, 405, 406, 407, 408, 409, 406,
@@ -1881,8 +1880,8 @@ static const flex_int16_t yy_chk[4072] =
406, 410, 411, 412, 413, 415, 0, 307, 307, 307,
307, 307, 307, 307, 307, 388, 388, 0, 388, 414,
388, 388, 417, 388, 410, 418, 388, 419, 413, 388,
- 414, 420, 410, 388, 388, 413, 415, 388, 0, 0,
- 421, 0, 422, 0, 0, 423, 388, 388, 416, 388,
+ 414, 420, 410, 388, 388, 413, 415, 388, 0, 740,
+ 421, 740, 422, 949, 949, 423, 388, 388, 416, 388,
414, 388, 388, 417, 388, 416, 418, 388, 419, 413,
388, 414, 420, 424, 388, 388, 425, 426, 388, 393,
@@ -1893,269 +1892,265 @@ static const flex_int16_t yy_chk[4072] =
444, 428, 429, 431, 430, 432, 433, 445, 393, 393,
434, 435, 393, 436, 437, 446, 430, 439, 447, 448,
440, 449, 450, 441, 451, 442, 453, 452, 443, 451,
- 454, 444, 452, 455, 458, 461, 469, 469, 445, 470,
-
- 470, 473, 454, 470, 470, 469, 446, 474, 475, 447,
- 448, 476, 449, 450, 477, 451, 478, 453, 452, 479,
- 451, 454, 480, 452, 455, 458, 461, 481, 482, 483,
- 484, 485, 473, 454, 486, 487, 469, 488, 474, 475,
- 489, 490, 476, 491, 492, 477, 493, 478, 494, 496,
- 479, 497, 498, 480, 499, 500, 501, 502, 481, 482,
- 483, 484, 485, 503, 504, 486, 487, 505, 488, 506,
- 0, 489, 490, 508, 491, 492, 507, 493, 506, 494,
- 496, 511, 497, 498, 512, 499, 500, 501, 502, 507,
- 514, 515, 519, 520, 503, 504, 523, 524, 505, 525,
-
- 506, 508, 526, 527, 508, 529, 530, 507, 531, 532,
- 533, 534, 511, 535, 537, 512, 538, 539, 540, 541,
- 542, 514, 515, 519, 520, 544, 545, 523, 524, 543,
- 525, 546, 547, 526, 527, 538, 529, 530, 543, 531,
- 532, 533, 534, 548, 535, 537, 549, 538, 539, 540,
- 541, 542, 550, 551, 552, 553, 544, 545, 554, 555,
- 543, 556, 546, 547, 557, 558, 538, 559, 560, 543,
- 562, 563, 564, 565, 548, 566, 567, 549, 568, 569,
- 571, 572, 573, 550, 551, 552, 553, 574, 575, 554,
- 555, 576, 556, 577, 578, 557, 558, 579, 559, 560,
-
- 580, 562, 563, 564, 565, 581, 566, 567, 582, 568,
- 569, 571, 572, 573, 583, 584, 585, 587, 574, 575,
- 588, 590, 576, 589, 577, 578, 591, 592, 579, 593,
- 589, 580, 594, 595, 597, 598, 581, 599, 601, 582,
- 602, 603, 598, 604, 605, 583, 584, 585, 587, 606,
- 607, 588, 590, 608, 589, 610, 611, 591, 592, 612,
- 593, 589, 613, 594, 595, 597, 598, 614, 599, 601,
- 609, 602, 603, 598, 604, 605, 609, 615, 616, 617,
- 606, 607, 618, 619, 608, 620, 610, 611, 609, 621,
- 612, 622, 624, 613, 623, 625, 626, 627, 614, 628,
-
- 623, 609, 630, 632, 634, 635, 636, 609, 615, 616,
- 617, 633, 623, 618, 619, 633, 620, 637, 638, 609,
- 621, 639, 622, 624, 640, 623, 625, 626, 627, 641,
- 628, 623, 642, 630, 632, 634, 635, 636, 643, 644,
- 645, 646, 633, 623, 647, 648, 633, 650, 637, 638,
- 651, 649, 639, 652, 653, 640, 649, 654, 655, 656,
- 641, 657, 658, 642, 659, 660, 661, 662, 663, 643,
- 644, 645, 646, 664, 665, 647, 648, 666, 650, 667,
- 668, 651, 649, 669, 652, 653, 670, 649, 654, 655,
- 656, 671, 657, 658, 672, 659, 660, 661, 662, 663,
-
- 673, 674, 675, 676, 664, 665, 679, 681, 666, 677,
- 667, 668, 682, 677, 669, 683, 679, 670, 684, 685,
- 687, 688, 671, 689, 690, 672, 691, 692, 693, 694,
- 695, 673, 674, 675, 676, 701, 702, 679, 681, 703,
- 677, 704, 705, 682, 677, 706, 683, 679, 707, 684,
- 685, 687, 688, 708, 689, 690, 709, 691, 692, 693,
- 694, 695, 710, 711, 712, 713, 701, 702, 714, 715,
- 703, 716, 704, 705, 717, 718, 706, 719, 720, 707,
- 721, 722, 723, 724, 708, 725, 726, 709, 727, 728,
- 730, 731, 0, 710, 711, 712, 713, 732, 736, 714,
-
- 715, 738, 716, 741, 743, 717, 718, 744, 719, 720,
- 734, 721, 722, 723, 724, 746, 725, 726, 747, 727,
- 728, 730, 731, 734, 749, 732, 750, 751, 732, 736,
- 752, 753, 738, 754, 741, 743, 756, 757, 744, 757,
- 758, 734, 759, 760, 761, 762, 746, 761, 763, 747,
- 764, 765, 767, 768, 769, 749, 770, 750, 751, 773,
- 775, 752, 753, 778, 754, 776, 776, 756, 757, 779,
- 757, 758, 780, 759, 760, 761, 762, 781, 761, 763,
- 782, 764, 765, 767, 768, 769, 783, 770, 784, 786,
- 773, 775, 787, 789, 778, 790, 776, 776, 793, 794,
-
- 779, 0, 0, 780, 796, 797, 799, 800, 781, 802,
- 803, 782, 804, 805, 806, 795, 0, 783, 809, 784,
- 786, 811, 0, 787, 789, 795, 790, 812, 795, 793,
- 794, 0, 795, 795, 813, 796, 797, 799, 800, 814,
- 802, 803, 815, 804, 805, 806, 795, 807, 816, 809,
- 807, 817, 811, 807, 818, 819, 795, 807, 812, 795,
- 820, 821, 807, 795, 795, 813, 822, 823, 824, 825,
- 814, 826, 827, 815, 828, 829, 830, 831, 807, 816,
- 833, 807, 817, 834, 807, 818, 819, 835, 807, 836,
- 837, 820, 821, 807, 838, 839, 840, 822, 823, 824,
-
- 825, 841, 826, 827, 842, 828, 829, 830, 831, 843,
- 844, 833, 846, 848, 834, 849, 850, 851, 835, 852,
- 836, 837, 853, 854, 855, 838, 839, 840, 856, 857,
- 858, 859, 841, 860, 861, 842, 862, 863, 864, 865,
- 843, 844, 866, 846, 848, 868, 849, 850, 851, 867,
- 852, 869, 870, 853, 854, 855, 871, 873, 867, 856,
- 857, 858, 859, 874, 860, 861, 875, 862, 863, 864,
- 865, 872, 876, 866, 877, 878, 868, 879, 872, 880,
- 867, 884, 869, 870, 885, 886, 887, 871, 873, 867,
- 888, 889, 891, 883, 874, 883, 892, 875, 893, 894,
-
- 896, 897, 872, 876, 899, 877, 878, 898, 879, 872,
- 880, 883, 884, 898, 901, 885, 886, 887, 902, 903,
- 904, 888, 889, 891, 883, 907, 883, 892, 902, 893,
- 894, 896, 897, 908, 909, 899, 910, 911, 898, 912,
- 914, 915, 883, 916, 898, 901, 917, 918, 919, 902,
- 903, 904, 920, 921, 922, 923, 907, 924, 926, 902,
- 927, 928, 929, 931, 908, 909, 932, 910, 911, 933,
- 912, 914, 915, 936, 916, 938, 939, 917, 918, 919,
- 940, 941, 943, 920, 921, 922, 923, 947, 924, 926,
- 945, 927, 928, 929, 931, 946, 948, 932, 949, 950,
-
- 933, 951, 952, 953, 936, 954, 938, 939, 956, 959,
- 961, 940, 941, 943, 962, 963, 945, 964, 947, 946,
- 965, 945, 967, 969, 970, 971, 946, 948, 972, 949,
- 950, 973, 951, 952, 953, 975, 954, 976, 977, 956,
- 959, 961, 978, 980, 982, 962, 963, 983, 964, 985,
- 987, 965, 988, 967, 969, 970, 971, 989, 990, 972,
- 993, 994, 973, 995, 996, 997, 975, 999, 976, 977,
- 1000, 1001, 1002, 978, 980, 982, 1003, 1004, 983, 1005,
- 985, 987, 1006, 988, 1007, 1008, 1009, 1011, 989, 990,
- 1014, 993, 994, 1015, 995, 996, 997, 1010, 999, 1016,
-
- 1017, 1000, 1001, 1002, 1018, 1010, 1019, 1003, 1004, 1020,
- 1005, 1021, 1022, 1006, 1023, 1007, 1008, 1009, 1011, 1024,
- 1025, 1014, 1026, 1027, 1015, 1028, 1029, 1030, 1010, 1032,
- 1016, 1017, 1034, 1035, 1036, 1018, 1010, 1019, 1037, 1038,
- 1020, 1039, 1021, 1022, 1040, 1023, 1041, 1042, 1043, 1044,
- 1024, 1025, 1045, 1026, 1027, 1046, 1028, 1029, 1030, 1047,
- 1032, 1050, 1052, 1034, 1035, 1036, 1053, 1054, 1055, 1037,
- 1038, 1056, 1039, 1057, 1058, 1040, 1063, 1041, 1042, 1043,
- 1044, 1064, 1065, 1045, 1066, 1067, 1046, 1068, 1069, 1070,
- 1047, 1071, 1050, 1052, 1072, 1073, 1074, 1053, 1054, 1055,
-
- 1075, 1076, 1056, 1078, 1057, 1058, 1079, 1063, 1080, 1081,
- 1082, 1083, 1064, 1065, 1084, 1066, 1067, 1085, 1068, 1069,
- 1070, 1087, 1071, 1090, 1093, 1072, 1073, 1074, 1086, 1094,
- 1095, 1075, 1076, 1096, 1078, 1097, 1098, 1079, 1099, 1080,
- 1081, 1082, 1083, 1100, 1086, 1084, 1101, 1102, 1085, 1103,
- 1104, 1105, 1087, 1106, 1090, 1093, 1107, 1108, 1113, 1086,
- 1094, 1095, 1114, 1115, 1096, 1116, 1097, 1098, 1117, 1099,
- 1118, 1119, 1120, 1122, 1100, 1086, 1123, 1101, 1102, 1124,
- 1103, 1104, 1105, 1125, 1106, 1126, 1127, 1107, 1108, 1113,
- 1129, 1130, 1131, 1114, 1115, 1132, 1116, 1133, 1135, 1117,
-
- 1139, 1118, 1119, 1120, 1122, 1140, 1136, 1123, 1141, 1142,
- 1124, 1143, 1144, 1145, 1125, 1146, 1126, 1127, 1147, 1148,
- 1149, 1129, 1130, 1131, 1135, 1151, 1132, 1152, 1133, 1135,
- 1136, 1139, 1153, 1154, 1156, 1158, 1140, 1136, 1160, 1141,
- 1142, 1161, 1143, 1144, 1145, 1162, 1146, 1164, 1165, 1147,
- 1148, 1149, 1167, 1168, 1169, 1170, 1151, 1171, 1152, 1172,
- 1173, 1174, 1175, 1153, 1154, 1156, 1158, 1177, 1178, 1160,
- 1179, 1180, 1161, 1182, 1183, 1184, 1162, 1185, 1164, 1165,
- 1186, 1187, 1188, 1167, 1168, 1169, 1170, 1189, 1171, 1190,
- 1172, 1173, 1174, 1175, 1192, 1193, 1195, 1196, 1177, 1178,
-
- 1197, 1179, 1180, 1198, 1182, 1183, 1184, 1199, 1185, 1200,
- 1201, 1186, 1187, 1188, 1202, 1204, 1205, 1206, 1189, 1207,
- 1190, 1208, 1210, 1211, 1212, 1192, 1193, 1195, 1196, 1213,
- 1214, 1197, 1215, 1217, 1198, 1218, 1219, 1220, 1199, 1221,
- 1200, 1201, 1223, 1225, 1223, 1202, 1204, 1205, 1206, 1226,
- 1207, 1227, 1208, 1210, 1211, 1212, 1228, 1230, 1231, 1233,
- 1213, 1214, 1235, 1215, 1217, 1236, 1218, 1219, 1220, 1226,
- 1221, 1237, 1238, 1223, 1225, 1223, 1239, 1240, 1241, 1242,
- 1226, 1243, 1227, 1244, 1245, 1246, 1247, 1228, 1230, 1231,
- 1233, 1248, 1249, 1235, 1250, 1251, 1236, 1252, 1253, 1254,
-
- 1226, 1255, 1237, 1238, 1256, 1257, 1259, 1239, 1240, 1241,
- 1242, 1258, 1243, 1258, 1244, 1245, 1246, 1247, 1260, 1261,
- 1262, 1264, 1248, 1249, 1265, 1250, 1251, 1266, 1252, 1253,
- 1254, 1267, 1255, 1268, 1271, 1256, 1257, 1259, 1272, 1273,
- 1275, 1278, 1258, 1279, 1258, 1281, 1282, 1283, 1285, 1260,
- 1261, 1262, 1264, 1286, 1287, 1265, 1288, 1289, 1266, 1290,
- 0, 1296, 1267, 1293, 1268, 1271, 1297, 1292, 1298, 1272,
- 1273, 1275, 1278, 1299, 1279, 1300, 1281, 1282, 1283, 1285,
- 1293, 1302, 1303, 1304, 1286, 1287, 1305, 1288, 1289, 1306,
- 1290, 1292, 1296, 1307, 1293, 1308, 1309, 1297, 1292, 1298,
-
- 1310, 1311, 1313, 1314, 1299, 1315, 1300, 1316, 1317, 1318,
- 1319, 1321, 1302, 1303, 1304, 1322, 1323, 1305, 1324, 1326,
- 1306, 1327, 1328, 1330, 1307, 1331, 1308, 1309, 1332, 1333,
- 1334, 1310, 1311, 1313, 1314, 1335, 1315, 1336, 1316, 1317,
- 1318, 1319, 1321, 1337, 1338, 1339, 1322, 1323, 1340, 1324,
- 1326, 1341, 1327, 1328, 1330, 1342, 1331, 1343, 1344, 1332,
- 1333, 1334, 1345, 1346, 1347, 1348, 1335, 1349, 1336, 1350,
- 1354, 1355, 1356, 1357, 1337, 1338, 1339, 1358, 1359, 1340,
- 1360, 1361, 1341, 1364, 1365, 1366, 1342, 1367, 1343, 1344,
- 1368, 1369, 1370, 1345, 1346, 1347, 1348, 1372, 1349, 1373,
-
- 1350, 1354, 1355, 1356, 1357, 1375, 1376, 1378, 1358, 1359,
- 1379, 1360, 1361, 1380, 1364, 1365, 1366, 1382, 1367, 1383,
- 1384, 1368, 1369, 1370, 1385, 1386, 1388, 1390, 1372, 1391,
- 1373, 1393, 1394, 1395, 1396, 1397, 1375, 1376, 1378, 1398,
- 1399, 1379, 1402, 1404, 1380, 1405, 1406, 1410, 1382, 1411,
- 1383, 1384, 1413, 1417, 1418, 1385, 1386, 1388, 1390, 1419,
- 1391, 1421, 1393, 1394, 1395, 1396, 1397, 1422, 1426, 1424,
- 1398, 1399, 1425, 1402, 1404, 1427, 1405, 1406, 1410, 1429,
- 1411, 1431, 1433, 1413, 1417, 1418, 1424, 1435, 1436, 1425,
- 1419, 1438, 1421, 1440, 1441, 1443, 1444, 1445, 1422, 1426,
-
- 1424, 1446, 1448, 1425, 1452, 1454, 1427, 1455, 1456, 1457,
- 1429, 1458, 1431, 1433, 1460, 1461, 1462, 1463, 1435, 1436,
- 1464, 1465, 1438, 1466, 1440, 1441, 1443, 1444, 1445, 1467,
- 1468, 1469, 1446, 1448, 1470, 1452, 1454, 1472, 1455, 1456,
- 1457, 1473, 1458, 1474, 1475, 1460, 1461, 1462, 1463, 1476,
- 1477, 1464, 1465, 1478, 1466, 1479, 1480, 1481, 1482, 1483,
- 1467, 1468, 1469, 1484, 1485, 1470, 1486, 1487, 1472, 1488,
- 1489, 1490, 1473, 1491, 1474, 1475, 1492, 1493, 1494, 1495,
- 1476, 1477, 1496, 1497, 1478, 1499, 1479, 1480, 1481, 1482,
- 1483, 1501, 1502, 1503, 1484, 1485, 1504, 1486, 1487, 1505,
-
- 1488, 1489, 1490, 1506, 1491, 1507, 1511, 1492, 1493, 1494,
- 1495, 1514, 1516, 1496, 1497, 1517, 1499, 1518, 1519, 1520,
- 1521, 1522, 1501, 1502, 1503, 1523, 1527, 1504, 1525, 1526,
- 1505, 1529, 1530, 1534, 1506, 1535, 1507, 1511, 1534, 1526,
- 1539, 1540, 1514, 1516, 1543, 1525, 1517, 1547, 1518, 1519,
- 1520, 1521, 1522, 1548, 1549, 1550, 1523, 1527, 1551, 1525,
- 1526, 1552, 1529, 1530, 1534, 1555, 1535, 1556, 1557, 1534,
- 1558, 1539, 1540, 1559, 1560, 1543, 1561, 1562, 1547, 1564,
- 1565, 1566, 1567, 1568, 1548, 1549, 1550, 1569, 1570, 1551,
- 1571, 1572, 1552, 1574, 1575, 1576, 1555, 1577, 1556, 1557,
-
- 1578, 1558, 1579, 1581, 1559, 1560, 1584, 1561, 1562, 1585,
- 1564, 1565, 1566, 1567, 1568, 1587, 1591, 1593, 1569, 1570,
- 1594, 1571, 1572, 1595, 1574, 1575, 1576, 1606, 1577, 1603,
- 1604, 1578, 1607, 1579, 1581, 1608, 1609, 1584, 1610, 1603,
- 1585, 1611, 1612, 1613, 1615, 1616, 1587, 1591, 1593, 1617,
- 1604, 1594, 1618, 1619, 1595, 1624, 1625, 1626, 1606, 1629,
- 1603, 1604, 1632, 1607, 1633, 1635, 1608, 1609, 1637, 1610,
- 1638, 1639, 1611, 1612, 1613, 1615, 1616, 1640, 1643, 1646,
- 1617, 1648, 1649, 1618, 1619, 1651, 1624, 1625, 1626, 1652,
- 1629, 1653, 1652, 1632, 1655, 1633, 1635, 1656, 1657, 1637,
-
- 1659, 1638, 1639, 1660, 1661, 1651, 1662, 1663, 1640, 1643,
- 1646, 1665, 1648, 1649, 1666, 1667, 1651, 1669, 1670, 1672,
- 1652, 1673, 1653, 1677, 1678, 1655, 1679, 1680, 1656, 1657,
- 1681, 1659, 1682, 1681, 1660, 1661, 1683, 1662, 1663, 1684,
- 1685, 1689, 1665, 1690, 1692, 1666, 1667, 1693, 1669, 1670,
- 1672, 1695, 1673, 1699, 1677, 1678, 1682, 1679, 1680, 1700,
- 1701, 1681, 1702, 1682, 1703, 1705, 1706, 1683, 1708, 1709,
- 1684, 1685, 1689, 1710, 1690, 1692, 1711, 1715, 1693, 1720,
- 1721, 1722, 1695, 1725, 1699, 1727, 1728, 1729, 1703, 1732,
- 1700, 1701, 1733, 1702, 0, 1703, 1705, 1706, 0, 1708,
-
- 1709, 0, 0, 0, 1710, 0, 0, 1711, 1715, 0,
- 1720, 1721, 1722, 0, 1725, 0, 1727, 1728, 1729, 0,
- 1732, 0, 0, 1733, 1737, 1737, 1737, 1737, 1737, 1737,
- 1737, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1739, 1739,
- 1739, 1739, 1739, 1739, 1739, 1740, 0, 1740, 1740, 1740,
- 1740, 1740, 1741, 0, 1741, 1741, 1741, 1741, 1741, 1743,
- 1743, 1743, 1743, 1743, 1743, 1743, 1744, 1744, 1744, 1744,
- 1744, 1744, 1744, 1745, 0, 1745, 1745, 1745, 1745, 1745,
- 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1747, 1747, 1747,
- 1747, 1747, 1747, 1747, 1748, 1748, 1748, 1748, 1748, 1748,
-
- 1748, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1750, 1750,
- 0, 0, 1750, 1750, 1751, 0, 1751, 1751, 0, 1751,
- 1751, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1753, 1753,
- 1753, 1753, 1753, 1753, 1753, 1754, 1754, 1754, 1754, 1754,
- 1754, 1754, 1755, 1755, 0, 1755, 1755, 1755, 1755, 1756,
- 1756, 1756, 0, 1756, 1756, 1756, 1757, 1757, 1757, 1757,
- 1757, 1757, 1757, 1758, 0, 1758, 1758, 1758, 1758, 1758,
- 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1760, 0, 1760,
- 1760, 1760, 1760, 1760, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
-
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736
+ 454, 444, 452, 455, 458, 461, 466, 468, 445, 471,
+
+ 471, 0, 454, 475, 476, 477, 446, 0, 471, 447,
+ 448, 478, 449, 450, 479, 451, 480, 453, 452, 481,
+ 451, 454, 482, 452, 455, 458, 461, 472, 472, 483,
+ 484, 472, 472, 454, 475, 476, 477, 466, 468, 471,
+ 485, 486, 478, 487, 488, 479, 489, 480, 490, 491,
+ 481, 492, 493, 482, 494, 495, 496, 498, 499, 500,
+ 483, 484, 501, 502, 503, 504, 505, 506, 507, 508,
+ 514, 485, 486, 0, 487, 488, 515, 489, 508, 490,
+ 491, 510, 492, 493, 517, 494, 495, 496, 498, 499,
+ 500, 509, 518, 501, 502, 503, 504, 505, 506, 507,
+
+ 508, 514, 522, 523, 509, 526, 527, 515, 528, 510,
+ 529, 530, 510, 532, 533, 517, 534, 535, 536, 537,
+ 538, 540, 509, 518, 541, 542, 543, 544, 545, 546,
+ 547, 548, 549, 522, 523, 550, 526, 527, 546, 528,
+ 551, 529, 530, 541, 532, 533, 552, 534, 535, 536,
+ 537, 538, 540, 553, 554, 541, 542, 543, 544, 545,
+ 546, 547, 548, 549, 555, 556, 550, 557, 558, 546,
+ 559, 551, 560, 561, 541, 562, 563, 552, 565, 566,
+ 567, 568, 569, 570, 553, 554, 571, 572, 574, 575,
+ 576, 577, 578, 579, 580, 555, 556, 581, 557, 558,
+
+ 582, 559, 583, 560, 561, 584, 562, 563, 585, 565,
+ 566, 567, 568, 569, 570, 586, 587, 571, 572, 574,
+ 575, 576, 577, 578, 579, 580, 588, 590, 581, 591,
+ 592, 582, 593, 583, 594, 595, 584, 592, 596, 585,
+ 597, 598, 600, 601, 602, 604, 586, 587, 605, 606,
+ 601, 607, 608, 609, 610, 611, 0, 588, 590, 613,
+ 591, 592, 0, 593, 614, 594, 595, 615, 592, 596,
+ 616, 597, 598, 600, 601, 602, 604, 617, 618, 605,
+ 606, 601, 607, 608, 609, 610, 611, 612, 619, 620,
+ 613, 621, 622, 612, 623, 614, 624, 625, 615, 627,
+
+ 628, 616, 629, 630, 631, 612, 633, 635, 617, 618,
+ 636, 626, 637, 638, 636, 639, 640, 626, 612, 619,
+ 620, 641, 621, 622, 612, 623, 642, 624, 625, 626,
+ 627, 628, 643, 629, 630, 631, 612, 633, 635, 644,
+ 645, 636, 626, 637, 638, 636, 639, 640, 626, 646,
+ 647, 648, 641, 649, 650, 651, 652, 642, 653, 654,
+ 626, 652, 655, 643, 656, 657, 658, 659, 660, 661,
+ 644, 645, 662, 663, 664, 665, 666, 667, 668, 669,
+ 646, 647, 648, 670, 649, 650, 651, 652, 671, 653,
+ 654, 672, 652, 655, 673, 656, 657, 658, 659, 660,
+
+ 661, 674, 675, 662, 663, 664, 665, 666, 667, 668,
+ 669, 676, 677, 678, 670, 679, 680, 682, 684, 671,
+ 680, 685, 672, 686, 687, 673, 688, 682, 690, 691,
+ 692, 693, 674, 675, 694, 695, 696, 697, 698, 705,
+ 706, 707, 676, 677, 678, 708, 679, 680, 682, 684,
+ 709, 680, 685, 710, 686, 687, 711, 688, 682, 690,
+ 691, 692, 693, 712, 713, 694, 695, 696, 697, 698,
+ 705, 706, 707, 714, 715, 716, 708, 717, 718, 719,
+ 720, 709, 721, 722, 710, 723, 724, 711, 725, 726,
+ 727, 728, 729, 730, 712, 713, 731, 732, 734, 735,
+
+ 0, 741, 738, 736, 714, 715, 716, 743, 717, 718,
+ 719, 720, 746, 721, 722, 738, 723, 724, 748, 725,
+ 726, 727, 728, 729, 730, 749, 751, 731, 732, 734,
+ 735, 736, 741, 738, 736, 752, 754, 755, 743, 756,
+ 757, 758, 759, 746, 761, 762, 763, 762, 764, 748,
+ 765, 766, 767, 768, 766, 769, 749, 751, 770, 772,
+ 773, 774, 775, 778, 780, 783, 752, 754, 755, 784,
+ 756, 757, 758, 759, 785, 761, 762, 763, 762, 764,
+ 786, 765, 766, 767, 768, 766, 769, 781, 781, 770,
+ 772, 773, 774, 775, 778, 780, 783, 787, 788, 789,
+
+ 784, 791, 792, 794, 795, 785, 798, 799, 0, 801,
+ 802, 786, 0, 0, 804, 805, 807, 808, 781, 781,
+ 809, 810, 811, 814, 816, 0, 800, 817, 787, 788,
+ 789, 0, 791, 792, 794, 795, 800, 798, 799, 800,
+ 801, 802, 818, 800, 800, 804, 805, 807, 808, 819,
+ 820, 809, 810, 811, 814, 816, 812, 800, 817, 812,
+ 821, 822, 812, 823, 824, 825, 812, 800, 826, 827,
+ 800, 812, 828, 818, 800, 800, 829, 830, 831, 832,
+ 819, 820, 833, 834, 835, 836, 838, 812, 839, 840,
+ 812, 821, 822, 812, 823, 824, 825, 812, 841, 826,
+
+ 827, 842, 812, 828, 843, 844, 845, 829, 830, 831,
+ 832, 846, 847, 833, 834, 835, 836, 838, 848, 839,
+ 840, 849, 851, 853, 854, 855, 856, 857, 858, 841,
+ 859, 860, 842, 861, 862, 843, 844, 845, 863, 864,
+ 865, 866, 846, 847, 867, 868, 869, 870, 871, 848,
+ 873, 872, 849, 851, 853, 854, 855, 856, 857, 858,
+ 872, 859, 860, 874, 861, 862, 875, 876, 878, 863,
+ 864, 865, 866, 877, 879, 867, 868, 869, 870, 871,
+ 877, 873, 872, 880, 881, 882, 883, 884, 885, 889,
+ 888, 872, 888, 890, 874, 891, 892, 875, 876, 878,
+
+ 893, 894, 896, 897, 877, 879, 898, 899, 888, 901,
+ 902, 877, 904, 906, 880, 881, 882, 883, 884, 885,
+ 889, 888, 903, 888, 890, 907, 891, 892, 903, 908,
+ 909, 893, 894, 896, 897, 907, 912, 898, 899, 888,
+ 901, 902, 913, 904, 906, 914, 915, 916, 917, 919,
+ 920, 921, 922, 903, 923, 924, 907, 925, 926, 903,
+ 908, 909, 927, 928, 929, 931, 907, 912, 932, 933,
+ 934, 936, 937, 913, 938, 941, 914, 915, 916, 917,
+ 919, 920, 921, 922, 943, 923, 924, 944, 925, 926,
+ 945, 946, 948, 927, 928, 929, 931, 0, 950, 932,
+
+ 933, 934, 936, 937, 951, 938, 941, 952, 954, 952,
+ 955, 956, 957, 958, 959, 943, 960, 961, 944, 963,
+ 966, 945, 946, 948, 950, 968, 969, 970, 951, 950,
+ 971, 972, 974, 976, 977, 951, 978, 979, 980, 954,
+ 982, 955, 956, 957, 958, 959, 983, 960, 961, 984,
+ 963, 966, 985, 987, 989, 990, 968, 969, 970, 992,
+ 994, 971, 972, 974, 976, 977, 995, 978, 979, 980,
+ 996, 982, 997, 1000, 1001, 1002, 1003, 983, 1004, 1006,
+ 984, 1007, 1008, 985, 987, 989, 990, 1009, 1010, 1011,
+ 992, 994, 1012, 1013, 1014, 1015, 1016, 995, 1018, 1021,
+
+ 1017, 996, 1022, 997, 1000, 1001, 1002, 1003, 1017, 1004,
+ 1006, 1023, 1007, 1008, 1024, 1025, 1026, 1027, 1009, 1010,
+ 1011, 1028, 1029, 1012, 1013, 1014, 1015, 1016, 1030, 1018,
+ 1021, 1017, 1031, 1022, 1032, 1033, 1034, 1035, 1036, 1017,
+ 1037, 1039, 1023, 1041, 1042, 1024, 1025, 1026, 1027, 1043,
+ 1044, 1045, 1028, 1029, 1046, 1047, 1048, 1049, 1050, 1030,
+ 1051, 1052, 1053, 1031, 1054, 1032, 1033, 1034, 1035, 1036,
+ 1057, 1037, 1039, 1059, 1041, 1042, 1060, 1061, 1062, 1063,
+ 1043, 1044, 1045, 1064, 1065, 1046, 1047, 1048, 1049, 1050,
+ 1070, 1051, 1052, 1053, 1071, 1054, 1072, 1073, 1074, 1075,
+
+ 1076, 1057, 1077, 1078, 1059, 1079, 1080, 1060, 1061, 1062,
+ 1063, 1081, 1082, 1083, 1064, 1065, 1085, 1086, 1087, 1088,
+ 1089, 1070, 1090, 1091, 1092, 1071, 1094, 1072, 1073, 1074,
+ 1075, 1076, 1097, 1077, 1078, 1100, 1079, 1080, 1101, 1102,
+ 1093, 1103, 1081, 1082, 1083, 1104, 1105, 1085, 1086, 1087,
+ 1088, 1089, 1106, 1090, 1091, 1092, 1093, 1094, 1107, 1108,
+ 1109, 1110, 1111, 1097, 1112, 1113, 1100, 1114, 1115, 1101,
+ 1102, 1093, 1103, 1120, 1121, 1122, 1104, 1105, 1123, 1124,
+ 1125, 1126, 1127, 1106, 1129, 1130, 1131, 1093, 1132, 1107,
+ 1108, 1109, 1110, 1111, 1133, 1112, 1113, 1134, 1114, 1115,
+
+ 1136, 1137, 1138, 1139, 1120, 1121, 1122, 1140, 1147, 1123,
+ 1124, 1125, 1126, 1127, 1142, 1129, 1130, 1131, 1143, 1132,
+ 1148, 1149, 1150, 1151, 1152, 1133, 1153, 1154, 1134, 1155,
+ 1156, 1136, 1137, 1138, 1139, 1157, 1159, 1160, 1140, 1147,
+ 1142, 1161, 1143, 1162, 1164, 1142, 1166, 1168, 1169, 1143,
+ 1170, 1148, 1149, 1150, 1151, 1152, 1172, 1153, 1154, 1173,
+ 1155, 1156, 1175, 1176, 1177, 1178, 1157, 1159, 1160, 1179,
+ 1180, 1181, 1161, 1182, 1162, 1164, 1183, 1166, 1168, 1169,
+ 1185, 1170, 1186, 1187, 1188, 1190, 1191, 1172, 1192, 1193,
+ 1173, 1194, 1195, 1175, 1176, 1177, 1178, 1196, 1197, 1198,
+
+ 1179, 1180, 1181, 1200, 1182, 1201, 1203, 1183, 1204, 1205,
+ 1206, 1185, 1207, 1186, 1187, 1188, 1190, 1191, 1208, 1192,
+ 1193, 1209, 1194, 1195, 1210, 1212, 1213, 1214, 1196, 1197,
+ 1198, 1215, 1216, 1218, 1200, 1219, 1201, 1203, 1220, 1204,
+ 1205, 1206, 1221, 1207, 1222, 1223, 1225, 1226, 1227, 1208,
+ 1228, 1229, 1209, 1233, 1234, 1210, 1212, 1213, 1214, 1231,
+ 1235, 1231, 1215, 1216, 1218, 1236, 1219, 1238, 1239, 1220,
+ 1241, 1243, 1244, 1221, 1234, 1222, 1223, 1225, 1226, 1227,
+ 1245, 1228, 1229, 1246, 1233, 1234, 1247, 1248, 1249, 1250,
+ 1231, 1235, 1231, 1251, 1252, 1253, 1236, 1254, 1238, 1239,
+
+ 1255, 1241, 1243, 1244, 1256, 1234, 1257, 1258, 1259, 1260,
+ 1261, 1245, 1262, 1263, 1246, 1264, 1265, 1247, 1248, 1249,
+ 1250, 1266, 1267, 1266, 1251, 1252, 1253, 1268, 1254, 1269,
+ 1270, 1255, 1272, 1273, 1274, 1256, 1275, 1257, 1258, 1259,
+ 1260, 1261, 1276, 1262, 1263, 1279, 1264, 1265, 1280, 1281,
+ 1283, 1286, 1266, 1267, 1266, 1287, 1289, 1290, 1268, 1291,
+ 1269, 1270, 1293, 1272, 1273, 1274, 1294, 1275, 1295, 1296,
+ 1297, 1298, 1300, 1276, 1301, 1304, 1279, 1305, 1306, 1280,
+ 1281, 1283, 1286, 1307, 1308, 1310, 1287, 1289, 1290, 1311,
+ 1291, 1301, 1312, 1293, 1313, 1314, 1300, 1294, 1315, 1295,
+
+ 1296, 1297, 1298, 1300, 1316, 1301, 1304, 1317, 1305, 1306,
+ 1318, 1319, 1321, 1322, 1307, 1308, 1310, 1323, 1324, 1325,
+ 1311, 1326, 1327, 1312, 1329, 1313, 1314, 1330, 1331, 1315,
+ 1332, 1334, 1335, 1336, 1338, 1316, 1339, 1340, 1317, 1341,
+ 1342, 1318, 1319, 1321, 1322, 1343, 1344, 1345, 1323, 1324,
+ 1325, 1346, 1326, 1327, 1347, 1329, 1348, 1349, 1330, 1331,
+ 1350, 1332, 1334, 1335, 1336, 1338, 1351, 1339, 1340, 1352,
+ 1341, 1342, 1353, 1354, 1355, 1356, 1343, 1344, 1345, 1357,
+ 1358, 1362, 1346, 1363, 1364, 1347, 1365, 1348, 1349, 1366,
+ 1367, 1350, 1368, 1369, 1372, 1373, 1374, 1351, 1375, 1376,
+
+ 1352, 1377, 1378, 1353, 1354, 1355, 1356, 1380, 1381, 1383,
+ 1357, 1358, 1362, 1384, 1363, 1364, 1386, 1365, 1387, 1388,
+ 1366, 1367, 1390, 1368, 1369, 1372, 1373, 1374, 1391, 1375,
+ 1376, 1392, 1377, 1378, 1393, 1394, 1396, 1398, 1380, 1381,
+ 1383, 1399, 1401, 1402, 1384, 1403, 1404, 1386, 1405, 1387,
+ 1388, 1406, 1407, 1390, 1410, 1412, 1413, 1414, 1418, 1391,
+ 1419, 1421, 1392, 1425, 1426, 1393, 1394, 1396, 1398, 1427,
+ 1429, 1430, 1399, 1401, 1402, 1434, 1403, 1404, 1435, 1405,
+ 1432, 1433, 1406, 1407, 1437, 1410, 1412, 1413, 1414, 1418,
+ 1439, 1419, 1421, 1441, 1425, 1426, 1443, 1432, 1433, 1444,
+
+ 1427, 1429, 1430, 1446, 1448, 1449, 1434, 1451, 1452, 1435,
+ 1453, 1432, 1433, 1454, 1456, 1437, 1460, 1462, 1463, 1464,
+ 1465, 1439, 1466, 1468, 1441, 1469, 1470, 1443, 1471, 1472,
+ 1444, 1473, 1474, 1475, 1446, 1448, 1449, 1476, 1451, 1452,
+ 1477, 1453, 1478, 1480, 1454, 1456, 1481, 1460, 1462, 1463,
+ 1464, 1465, 1482, 1466, 1468, 1483, 1469, 1470, 1484, 1471,
+ 1472, 1485, 1473, 1474, 1475, 1486, 1487, 1488, 1476, 1489,
+ 1490, 1477, 1491, 1478, 1480, 1492, 1493, 1481, 1494, 1495,
+ 1496, 1497, 1498, 1482, 1499, 1500, 1483, 1501, 1502, 1484,
+ 1503, 1504, 1485, 1505, 1507, 1509, 1486, 1487, 1488, 1510,
+
+ 1489, 1490, 1511, 1491, 1512, 1513, 1492, 1493, 1514, 1494,
+ 1495, 1496, 1497, 1498, 1515, 1499, 1500, 1519, 1501, 1502,
+ 1522, 1503, 1504, 1524, 1505, 1507, 1509, 1525, 1526, 1527,
+ 1510, 1528, 1529, 1511, 1530, 1512, 1513, 1531, 1533, 1514,
+ 1534, 1535, 1537, 1538, 1542, 1515, 1543, 1547, 1519, 1542,
+ 1534, 1522, 1548, 1551, 1524, 1533, 1555, 1556, 1525, 1526,
+ 1527, 1557, 1528, 1529, 1558, 1530, 1559, 1560, 1531, 1533,
+ 1563, 1534, 1535, 1537, 1538, 1542, 1564, 1543, 1547, 1565,
+ 1542, 1566, 1567, 1548, 1551, 1568, 1569, 1555, 1556, 1570,
+ 1572, 1573, 1557, 1574, 1575, 1558, 1576, 1559, 1560, 1577,
+
+ 1578, 1563, 1579, 1580, 1582, 1583, 1584, 1564, 1585, 1586,
+ 1565, 1587, 1566, 1567, 1589, 1592, 1568, 1569, 1593, 1595,
+ 1570, 1572, 1573, 1599, 1574, 1575, 1601, 1576, 1602, 1603,
+ 1577, 1578, 1612, 1579, 1580, 1582, 1583, 1584, 1611, 1585,
+ 1586, 1614, 1587, 1615, 1616, 1589, 1592, 1617, 1611, 1593,
+ 1595, 1618, 1612, 1619, 1599, 1620, 1621, 1601, 1623, 1602,
+ 1603, 1624, 1625, 1612, 1626, 1627, 1632, 1633, 1634, 1611,
+ 1637, 1640, 1614, 1641, 1615, 1616, 1643, 1645, 1617, 1646,
+ 1647, 1648, 1618, 1651, 1619, 1654, 1620, 1621, 1656, 1623,
+ 1657, 1660, 1624, 1625, 1660, 1626, 1627, 1632, 1633, 1634,
+
+ 1659, 1637, 1640, 1661, 1641, 1663, 1664, 1643, 1645, 1665,
+ 1646, 1647, 1648, 1667, 1651, 1668, 1654, 1669, 1670, 1656,
+ 1659, 1657, 1660, 1671, 1673, 1674, 1675, 1677, 1678, 1680,
+ 1681, 1659, 1685, 1686, 1661, 1687, 1663, 1664, 1688, 1689,
+ 1665, 1690, 1689, 1691, 1667, 1692, 1668, 1693, 1669, 1670,
+ 1697, 1698, 1700, 1701, 1671, 1673, 1674, 1675, 1677, 1678,
+ 1680, 1681, 1703, 1685, 1686, 1690, 1687, 1707, 1708, 1688,
+ 1689, 1709, 1690, 1710, 1691, 1713, 1692, 1711, 1693, 1714,
+ 1716, 1697, 1698, 1700, 1701, 1717, 1718, 1719, 1723, 1728,
+ 1729, 1730, 1733, 1703, 1735, 1736, 1737, 1740, 1707, 1708,
+
+ 1741, 1711, 1709, 0, 1710, 0, 1713, 0, 1711, 0,
+ 1714, 1716, 0, 0, 0, 0, 1717, 1718, 1719, 1723,
+ 1728, 1729, 1730, 1733, 0, 1735, 1736, 1737, 1740, 0,
+ 0, 1741, 1745, 1745, 1745, 1745, 1745, 1746, 1746, 1746,
+ 1746, 1746, 1747, 1747, 1747, 1747, 1747, 1748, 0, 1748,
+ 1748, 1748, 1749, 0, 1749, 1749, 1749, 1751, 1751, 1751,
+ 1751, 1751, 1752, 1752, 1752, 1752, 1752, 1753, 0, 1753,
+ 1753, 1753, 1754, 1754, 1754, 1754, 1754, 1755, 1755, 1755,
+ 1755, 1755, 1756, 1756, 1756, 1756, 1756, 1757, 1757, 1757,
+ 1757, 1757, 1758, 1758, 0, 1758, 1758, 1759, 0, 1759,
+
+ 0, 1759, 1760, 1760, 1760, 1760, 1760, 1761, 1761, 1761,
+ 1761, 1761, 1762, 1762, 1762, 1762, 1762, 1763, 1763, 1763,
+ 1763, 1763, 1764, 1764, 1764, 1764, 1764, 1765, 1765, 1765,
+ 1765, 1765, 1766, 0, 1766, 1766, 1766, 1767, 1767, 1767,
+ 1767, 1767, 1768, 0, 1768, 1768, 1768, 1769, 1769, 1769,
+ 1769, 1769, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744
} ;
static yy_state_type yy_last_accepting_state;
@@ -2285,9 +2280,9 @@ int include_lineno[MAX_INCLUDE_DEPTH];
int include_stack_ptr = 0;
char path[MS_MAXPATHLEN];
-#line 2289 "src/maplexer.c"
+#line 2283 "src/maplexer.c"
-#line 2291 "src/maplexer.c"
+#line 2285 "src/maplexer.c"
#define INITIAL 0
#define EXPRESSION_STRING 1
@@ -2567,7 +2562,7 @@ YY_DECL
break;
}
-#line 2571 "src/maplexer.c"
+#line 2565 "src/maplexer.c"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -2594,13 +2589,13 @@ YY_DECL
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 1737 )
+ if ( yy_current_state >= 1745 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
- while ( yy_current_state != 1736 );
+ while ( yy_current_state != 1744 );
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
@@ -4264,27 +4259,28 @@ YY_RULE_SETUP
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
strcpy(msyystring_buffer, msyytext);
+ msStringUnescape(msyystring_buffer, ']');
return(MS_TOKEN_BINDING_DOUBLE);
}
YY_BREAK
case 325:
/* rule 325 can match eol */
YY_RULE_SETUP
-#line 552 "src/maplexer.l"
+#line 553 "src/maplexer.l"
{
/* attribute binding - string (single or double quotes) */
- msyytext+=2;
- msyytext[msyyleng-2-2] = '\0';
+ msyytext[msyyleng-2] = '\0';
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
- strcpy(msyystring_buffer, msyytext);
+ strcpy(msyystring_buffer, msyytext + 2);
+ msStringUnescape(msyystring_buffer, msyytext[0]);
return(MS_TOKEN_BINDING_STRING);
}
YY_BREAK
case 326:
/* rule 326 can match eol */
YY_RULE_SETUP
-#line 561 "src/maplexer.l"
+#line 562 "src/maplexer.l"
{
/* attribute binding - time */
msyytext+=2;
@@ -4292,12 +4288,13 @@ YY_RULE_SETUP
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
strcpy(msyystring_buffer, msyytext);
+ msStringUnescape(msyystring_buffer, '`');
return(MS_TOKEN_BINDING_TIME);
}
YY_BREAK
case 327:
YY_RULE_SETUP
-#line 571 "src/maplexer.l"
+#line 573 "src/maplexer.l"
{
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
@@ -4308,7 +4305,7 @@ YY_RULE_SETUP
YY_BREAK
case 328:
YY_RULE_SETUP
-#line 579 "src/maplexer.l"
+#line 581 "src/maplexer.l"
{
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
@@ -4320,7 +4317,7 @@ YY_RULE_SETUP
case 329:
/* rule 329 can match eol */
YY_RULE_SETUP
-#line 587 "src/maplexer.l"
+#line 589 "src/maplexer.l"
{
msyytext++;
msyytext[msyyleng-1-1] = '\0';
@@ -4333,7 +4330,7 @@ YY_RULE_SETUP
case 330:
/* rule 330 can match eol */
YY_RULE_SETUP
-#line 596 "src/maplexer.l"
+#line 598 "src/maplexer.l"
{
msyytext++;
msyytext[msyyleng-1-2] = '\0';
@@ -4346,7 +4343,7 @@ YY_RULE_SETUP
case 331:
/* rule 331 can match eol */
YY_RULE_SETUP
-#line 605 "src/maplexer.l"
+#line 607 "src/maplexer.l"
{
msyytext++;
msyytext[msyyleng-1-1] = '\0';
@@ -4358,7 +4355,7 @@ YY_RULE_SETUP
YY_BREAK
case 332:
YY_RULE_SETUP
-#line 614 "src/maplexer.l"
+#line 616 "src/maplexer.l"
{
msyytext++;
msyytext[msyyleng-1-1] = '\0';
@@ -4370,7 +4367,7 @@ YY_RULE_SETUP
YY_BREAK
case 333:
YY_RULE_SETUP
-#line 623 "src/maplexer.l"
+#line 625 "src/maplexer.l"
{
msyytext++;
msyytext[msyyleng-1-1] = '\0';
@@ -4382,7 +4379,7 @@ YY_RULE_SETUP
YY_BREAK
case 334:
YY_RULE_SETUP
-#line 632 "src/maplexer.l"
+#line 634 "src/maplexer.l"
{
msyystring_return_state = MS_STRING;
msyystring_begin = msyytext[0];
@@ -4393,7 +4390,7 @@ YY_RULE_SETUP
YY_BREAK
case 335:
YY_RULE_SETUP
-#line 640 "src/maplexer.l"
+#line 642 "src/maplexer.l"
{
if (msyystring_begin == msyytext[0]) {
BEGIN(msyystring_begin_state);
@@ -4422,7 +4419,7 @@ YY_RULE_SETUP
YY_BREAK
case 336:
YY_RULE_SETUP
-#line 666 "src/maplexer.l"
+#line 668 "src/maplexer.l"
{
++msyystring_size;
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size,
@@ -4438,7 +4435,7 @@ YY_RULE_SETUP
case 337:
/* rule 337 can match eol */
YY_RULE_SETUP
-#line 678 "src/maplexer.l"
+#line 680 "src/maplexer.l"
{
int old_size = msyystring_size;
msyystring_size += msyyleng;
@@ -4450,7 +4447,7 @@ YY_RULE_SETUP
case 338:
/* rule 338 can match eol */
YY_RULE_SETUP
-#line 686 "src/maplexer.l"
+#line 688 "src/maplexer.l"
{
msyytext++;
msyytext[msyyleng-1-1] = '\0';
@@ -4479,7 +4476,7 @@ YY_RULE_SETUP
YY_BREAK
case 339:
YY_RULE_SETUP
-#line 712 "src/maplexer.l"
+#line 714 "src/maplexer.l"
{
msyystring_return_state = MS_TOKEN_LITERAL_STRING;
msyystring_begin = msyytext[0];
@@ -4490,7 +4487,7 @@ YY_RULE_SETUP
YY_BREAK
case 340:
YY_RULE_SETUP
-#line 720 "src/maplexer.l"
+#line 722 "src/maplexer.l"
{
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
@@ -4501,12 +4498,12 @@ YY_RULE_SETUP
case 341:
/* rule 341 can match eol */
YY_RULE_SETUP
-#line 727 "src/maplexer.l"
+#line 729 "src/maplexer.l"
{ msyylineno++; }
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(CONFIG_FILE):
-#line 729 "src/maplexer.l"
+#line 731 "src/maplexer.l"
{
if( --include_stack_ptr < 0 )
return(EOF); /* end of main file */
@@ -4521,14 +4518,14 @@ case YY_STATE_EOF(CONFIG_FILE):
case 342:
/* rule 342 can match eol */
YY_RULE_SETUP
-#line 740 "src/maplexer.l"
+#line 742 "src/maplexer.l"
{
return(0);
}
YY_BREAK
case 343:
YY_RULE_SETUP
-#line 744 "src/maplexer.l"
+#line 746 "src/maplexer.l"
{
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
@@ -4538,15 +4535,15 @@ YY_RULE_SETUP
YY_BREAK
case 344:
YY_RULE_SETUP
-#line 750 "src/maplexer.l"
+#line 752 "src/maplexer.l"
{ return(msyytext[0]); }
YY_BREAK
case 345:
YY_RULE_SETUP
-#line 751 "src/maplexer.l"
+#line 753 "src/maplexer.l"
ECHO;
YY_BREAK
-#line 4550 "src/maplexer.c"
+#line 4546 "src/maplexer.c"
case YY_STATE_EOF(EXPRESSION_STRING):
case YY_STATE_EOF(INCLUDE):
case YY_STATE_EOF(MSSTRING):
@@ -4847,7 +4844,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 1737 )
+ if ( yy_current_state >= 1745 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -4875,11 +4872,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 1737 )
+ if ( yy_current_state >= 1745 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
- yy_is_jam = (yy_current_state == 1736);
+ yy_is_jam = (yy_current_state == 1744);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -5555,7 +5552,7 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 751 "src/maplexer.l"
+#line 753 "src/maplexer.l"
/*
diff --git a/src/maplexer.l b/src/maplexer.l
index 8980475c8c..828425c891 100644
--- a/src/maplexer.l
+++ b/src/maplexer.l
@@ -539,31 +539,33 @@ char path[MS_MAXPATHLEN];
/* attribute binding - data cellsize */
return(MS_TOKEN_BINDING_DATA_CELLSIZE);
}
-\[[^\]]*\] {
+\[(?:\]\]|[^\]])*\] {
/* attribute binding - numeric (no quotes) */
msyytext++;
msyytext[msyyleng-1-1] = '\0';
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
strcpy(msyystring_buffer, msyytext);
+ msStringUnescape(msyystring_buffer, ']');
return(MS_TOKEN_BINDING_DOUBLE);
}
-\"\[[^\"]*\]\"|\'\[[^\']*\]\' {
+\"\[(?:\"\"|[^\"])*\]\"|\'\[(?:\'\'|[^\'])*\]\' {
/* attribute binding - string (single or double quotes) */
- msyytext+=2;
- msyytext[msyyleng-2-2] = '\0';
+ msyytext[msyyleng-2] = '\0';
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
- strcpy(msyystring_buffer, msyytext);
+ strcpy(msyystring_buffer, msyytext + 2);
+ msStringUnescape(msyystring_buffer, msyytext[0]);
return(MS_TOKEN_BINDING_STRING);
}
-\`\[[^\`]*\]\` {
+\`\[(?:\`\`|[^\`])*\]\` {
/* attribute binding - time */
msyytext+=2;
msyytext[msyyleng-2-2] = '\0';
MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng,
msyystring_buffer_size);
strcpy(msyystring_buffer, msyytext);
+ msStringUnescape(msyystring_buffer, '`');
return(MS_TOKEN_BINDING_TIME);
}
diff --git a/src/mapmssql2008.c b/src/mapmssql2008.c
index 631731eacc..f87f88e46b 100644
--- a/src/mapmssql2008.c
+++ b/src/mapmssql2008.c
@@ -2486,7 +2486,7 @@ int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape,
if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO)
handleSQLError(layer);
- if (retLen < (int)sizeof(oidBuffer)) {
+ if (retLen > 0 && retLen < (int)sizeof(oidBuffer)) {
oidBuffer[retLen] = 0;
record_oid = strtol(oidBuffer, NULL, 10);
shape->index = record_oid;
diff --git a/src/mapogcapi.cpp b/src/mapogcapi.cpp
index b88ababf22..0f4ca3381c 100644
--- a/src/mapogcapi.cpp
+++ b/src/mapogcapi.cpp
@@ -625,7 +625,7 @@ static json getFeatureGeometry(shapeObj *shape, int precision,
json polygon = json::array();
for (int i = 0; i < shape->numlines; i++) {
if (i == k ||
- outerList[i] ==
+ innerList[i] ==
MS_TRUE) { // add outer ring (k) and any inner rings
json part = json::array();
for (int j = 0; j < shape->line[i].numpoints; j++) {
@@ -1885,9 +1885,8 @@ static int processApiRequest(mapObj *map, cgiRequestObj *request,
{"content",
{{"application/json",
{{"schema",
- {{"$ref", "https://raw.githubusercontent.com/opengeospatial/"
- "ogcapi-processes/master/core/openapi/schemas/"
- "exception.yaml"}}}}}}}};
+ {{"$ref", "https://schemas.opengis.net/ogcapi/common/part1/1.0/"
+ "openapi/schemas/exception.yaml"}}}}}}}};
json parameters;
parameters["f"] = {
diff --git a/src/mapogcfiltercommon.cpp b/src/mapogcfiltercommon.cpp
index 7116707cb8..6e1d2dd971 100644
--- a/src/mapogcfiltercommon.cpp
+++ b/src/mapogcfiltercommon.cpp
@@ -34,6 +34,20 @@
#include
+static std::string FLTEscapePropertyName(const char *pszStr,
+ char chEscapeChar) {
+ std::string ret;
+ for (; *pszStr; ++pszStr) {
+ if (*pszStr == chEscapeChar) {
+ ret += chEscapeChar;
+ ret += chEscapeChar;
+ } else {
+ ret += *pszStr;
+ }
+ }
+ return ret;
+}
+
static std::string
FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) {
/* From
@@ -63,7 +77,7 @@ FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) {
std::string expr("(\"[");
/* attribute */
- expr += psFilterNode->psLeftNode->pszValue;
+ expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, '"');
/* #3521 */
if (bCaseInsensitive)
@@ -177,7 +191,8 @@ FLTGetIsBetweenComparisonCommonExpresssion(FilterEncodingNode *psFilterNode,
else
expr += "([";
- expr += psFilterNode->psLeftNode->pszValue;
+ expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue,
+ bString ? '"' : ']');
if (bString)
expr += "]\" ";
@@ -268,7 +283,9 @@ FLTGetBinaryComparisonCommonExpression(FilterEncodingNode *psFilterNode,
expr = "(\"[";
else
expr = "([";
- expr += psFilterNode->psLeftNode->pszValue;
+
+ expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue,
+ bString ? '"' : ']');
if (bString)
expr += "]\" ";
@@ -543,13 +560,13 @@ FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode,
if (pszAttribute) {
const auto tokens = msStringSplit(psFilterNode->pszValue, ',');
if (!tokens.empty()) {
+ bool bString = false;
for (size_t i = 0; i < tokens.size(); i++) {
const char *pszId = tokens[i].c_str();
const char *pszDot = strrchr(pszId, '.');
if (pszDot)
pszId = pszDot + 1;
- bool bString = false;
if (i == 0) {
if (FLTIsNumeric(pszId) == MS_FALSE)
bString = true;
@@ -562,13 +579,13 @@ FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode,
if (bString) {
expr += "(\"[";
- expr += pszAttribute;
+ expr += FLTEscapePropertyName(pszAttribute, '"');
expr += "]\" == \"";
expr += pszId;
expr += "\")";
} else {
expr += "([";
- expr += pszAttribute;
+ expr += FLTEscapePropertyName(pszAttribute, ']');
expr += "] == ";
expr += pszId;
expr += ")";
diff --git a/src/mapogr.cpp b/src/mapogr.cpp
index c1f837f596..2c8c55f540 100644
--- a/src/mapogr.cpp
+++ b/src/mapogr.cpp
@@ -1981,7 +1981,7 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) {
break;
}
case MS_TOKEN_BINDING_INTEGER: {
- char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item);
+ char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item);
nOutSize = strlen(stresc) + 20;
out = (char *)msSmallMalloc(nOutSize);
@@ -1989,15 +1989,15 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) {
// Do not cast if the variable is of the appropriate type as it can
// prevent using database indexes, such as for SQlite
if (bIsNumeric) {
- snprintf(out, nOutSize, "%s", stresc);
+ snprintf(out, nOutSize, "\"%s\"", stresc);
} else {
- snprintf(out, nOutSize, "CAST(%s AS integer)", stresc);
+ snprintf(out, nOutSize, "CAST(\"%s\" AS integer)", stresc);
}
msFree(stresc);
break;
}
case MS_TOKEN_BINDING_STRING: {
- char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item);
+ char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item);
nOutSize = strlen(stresc) + 30;
out = (char *)msSmallMalloc(nOutSize);
@@ -2006,24 +2006,24 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) {
// Do not cast if the variable is of the appropriate type as it can
// prevent using database indexes, such as for SQlite
if (bIsCharacter) {
- snprintf(out, nOutSize, "%s", stresc);
+ snprintf(out, nOutSize, "\"%s\"", stresc);
} else {
- snprintf(out, nOutSize, "CAST(%s AS text)", stresc);
+ snprintf(out, nOutSize, "CAST(\"%s\" AS text)", stresc);
}
msFree(stresc);
break;
}
case MS_TOKEN_BINDING_TIME: {
// won't get here unless col is parsed as time and they are not
- char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item);
+ char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item);
nOutSize = strlen(stresc) + 10;
out = (char *)msSmallMalloc(nOutSize);
- snprintf(out, nOutSize, "%s", stresc);
+ snprintf(out, nOutSize, "\"%s\"", stresc);
msFree(stresc);
break;
}
case MS_TOKEN_BINDING_SHAPE: {
- char *stresc = msOGRGetQuotedItem(
+ char *stresc = msLayerEscapePropertyName(
layer, OGR_L_GetGeometryColumn(info->hLayer)); // which geom field??
nOutSize = strlen(stresc) + 10;
out = (char *)msSmallMalloc(nOutSize);
@@ -2490,9 +2490,6 @@ static int msOGRFileWhichShapes(layerObj *layer, rectObj rect,
msFree(select);
return MS_FAILURE;
}
-
- // Update itemindexes / layer->iteminfo
- msOGRLayerInitItemInfo(layer);
} else {
// case of 1) GetLayer + SetFilter
@@ -3603,8 +3600,11 @@ msOGRTranslatePartialInternal(layerObj *layer, const msExprNode *expr,
case MS_TOKEN_BINDING_INTEGER:
case MS_TOKEN_BINDING_STRING:
case MS_TOKEN_BINDING_TIME: {
- char *pszTmp = msOGRGetQuotedItem(layer, expr->m_osVal.c_str());
- std::string osRet(pszTmp);
+ char *pszTmp = msLayerEscapePropertyName(layer, expr->m_osVal.c_str());
+ std::string osRet;
+ osRet += '"';
+ osRet += pszTmp;
+ osRet += '"';
msFree(pszTmp);
return osRet;
}
@@ -4009,6 +4009,10 @@ int msOGRLayerWhichShapes(layerObj *layer, rectObj rect, int /*isQuery*/) {
status = msOGRFileWhichShapes(layer, rect, psInfo);
+ // Update itemindexes / layer->iteminfo
+ if (status == MS_SUCCESS)
+ msOGRLayerInitItemInfo(layer);
+
if (status != MS_SUCCESS || layer->tileindex == NULL)
return status;
diff --git a/src/maporaclespatial.c b/src/maporaclespatial.c
index 150b337ac4..776aa837a0 100644
--- a/src/maporaclespatial.c
+++ b/src/maporaclespatial.c
@@ -1217,7 +1217,7 @@ static char *osAggrGetExtent(layerObj *layer, char *query_str,
size_t tmpFromSize =
sizeof(char) * (7 + strlen(geom_column_name) + strlen(table_name) + 1);
char *tmpFrom = msSmallMalloc(tmpFromSize);
- snprintf(tmpFrom, tmpFromSize, "%s FROM %s", geom_column_name, table_name);
+ snprintf(tmpFrom, tmpFromSize, " %s FROM %s", geom_column_name, table_name);
query_str2 = msStringConcatenate(query_str2, tmpFrom);
diff --git a/src/mappostgis.cpp b/src/mappostgis.cpp
index af02a4fada..77b9c78bb6 100644
--- a/src/mappostgis.cpp
+++ b/src/mappostgis.cpp
@@ -1978,9 +1978,9 @@ static std::string msPostGISBuildSQLWhere(layerObj *layer, const rectObj *rect,
return std::string();
}
- std::string strRectOtherSRID = "ST_Intersects(ST_Transform(";
+ std::string strRectOtherSRID = "ST_Intersects(ST_Transform(\"";
strRectOtherSRID += layerinfo->geomcolumn;
- strRectOtherSRID += ',';
+ strRectOtherSRID += "\",";
strRectOtherSRID += std::to_string(otherSRID);
strRectOtherSRID += "),";
strRectOtherSRID += strBox;
@@ -2009,9 +2009,9 @@ static std::string msPostGISBuildSQLWhere(layerObj *layer, const rectObj *rect,
return std::string();
}
- std::string strRectOtherSRID = "ST_Intersects(";
+ std::string strRectOtherSRID = "ST_Intersects(\"";
strRectOtherSRID += layerinfo->geomcolumn;
- strRectOtherSRID += ',';
+ strRectOtherSRID += "\",";
strRectOtherSRID += strBox;
strRectOtherSRID += ')';
@@ -3262,7 +3262,7 @@ static int msPostGISLayerGetExtent(layerObj *layer, rectObj *extent) {
auto layerinfo = (msPostGISLayerInfo *)layer->layerinfo;
const std::string strSQL(addTableNameAndFilterToSelectFrom(
- layer, "SELECT ST_Extent(" + layerinfo->geomcolumn + ") FROM "));
+ layer, "SELECT ST_Extent(\"" + layerinfo->geomcolumn + "\") FROM "));
if (layer->debug) {
msDebug("msPostGISLayerGetExtent executing SQL: %s\n", strSQL.c_str());
diff --git a/src/mapproject.c b/src/mapproject.c
index 3fc90a7cf9..56ab7a484f 100644
--- a/src/mapproject.c
+++ b/src/mapproject.c
@@ -73,9 +73,10 @@ struct projectionContext {
void *thread_id;
PJ_CONTEXT *proj_ctx;
unsigned ms_proj_data_change_counter;
- int ref_count;
+ int refcount;
pjCacheEntry pj_cache[PJ_CACHE_ENTRY_SIZE];
int pj_cache_size;
+ int cannotFindProjDb;
};
/************************************************************************/
@@ -327,7 +328,9 @@ static PJ *getBaseGeographicCRS(projectionObj *in) {
/************************************************************************/
static void msProjErrorLogger(void *user_data, int level, const char *message) {
- (void)user_data;
+ projectionContext *ctx = (projectionContext *)user_data;
+ if (strstr(message, "Cannot find proj.db"))
+ ctx->cannotFindProjDb = MS_TRUE;
if (level == PJ_LOG_ERROR && msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_VV) {
msDebug("PROJ: Error: %s\n", message);
} else if (level == PJ_LOG_DEBUG) {
@@ -335,6 +338,25 @@ static void msProjErrorLogger(void *user_data, int level, const char *message) {
}
}
+/************************************************************************/
+/* msProjGetProjErrorString() */
+/************************************************************************/
+
+static const char *msProjGetProjErrorString(projectionObj *p) {
+ const int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx);
+#if PROJ_VERSION_MAJOR >= 8
+ const char *projErrorStr =
+ proj_context_errno_string(p->proj_ctx->proj_ctx, l_pj_errno);
+#else
+ const char *projErrorStr = proj_errno_string(l_pj_errno);
+#endif
+ if (p->proj_ctx->cannotFindProjDb) {
+ projErrorStr = "Cannot find proj.db";
+ p->proj_ctx->cannotFindProjDb = MS_FALSE;
+ }
+ return projErrorStr;
+}
+
/************************************************************************/
/* msProjectionContextCreate() */
/************************************************************************/
@@ -348,9 +370,9 @@ projectionContext *msProjectionContextCreate(void) {
msFree(ctx);
return NULL;
}
- ctx->ref_count = 1;
+ MS_REFCNT_INIT(ctx);
proj_context_use_proj4_init_rules(ctx->proj_ctx, TRUE);
- proj_log_func(ctx->proj_ctx, NULL, msProjErrorLogger);
+ proj_log_func(ctx->proj_ctx, ctx, msProjErrorLogger);
return ctx;
}
@@ -361,8 +383,7 @@ projectionContext *msProjectionContextCreate(void) {
void msProjectionContextUnref(projectionContext *ctx) {
if (!ctx)
return;
- --ctx->ref_count;
- if (ctx->ref_count == 0) {
+ if (MS_REFCNT_DECR_IS_ZERO(ctx)) {
int i;
for (i = 0; i < ctx->pj_cache_size; i++) {
msFree(ctx->pj_cache[i].inStr);
@@ -555,7 +576,7 @@ void msProjectionInheritContextFrom(projectionObj *pDst,
if (pDst->proj_ctx == NULL && pSrc->proj_ctx != NULL) {
if (pSrc->proj_ctx->thread_id == msGetThreadId()) {
pDst->proj_ctx = pSrc->proj_ctx;
- pDst->proj_ctx->ref_count++;
+ MS_REFCNT_INCR(pDst->proj_ctx);
} else {
pDst->proj_ctx = msProjectionContextClone(pSrc->proj_ctx);
}
@@ -569,7 +590,7 @@ void msProjectionInheritContextFrom(projectionObj *pDst,
void msProjectionSetContext(projectionObj *p, projectionContext *ctx) {
if (p->proj_ctx == NULL && ctx != NULL) {
p->proj_ctx = ctx;
- p->proj_ctx->ref_count++;
+ MS_REFCNT_INCR(p->proj_ctx);
}
}
@@ -678,10 +699,8 @@ static int _msProcessAutoProjection(projectionObj *p) {
args = msStringSplit(szProjBuf, '+', &numargs);
if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, numargs, args))) {
- int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx);
- msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"",
- "msProcessProjection()", proj_errno_string(l_pj_errno),
- szProjBuf);
+ msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"",
+ "msProcessProjection()", msProjGetProjErrorString(p), szProjBuf);
msFreeCharArray(args, numargs);
return (-1);
}
@@ -750,9 +769,8 @@ int msProcessProjection(projectionObj *p) {
/* Deal e.g. with EPSG:XXXX or ESRI:XXXX */
if (!(p->proj =
proj_create_argv(p->proj_ctx->proj_ctx, p->numargs, p->args))) {
- int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx);
- msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"",
- "msProcessProjection()", proj_errno_string(l_pj_errno),
+ msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"",
+ "msProcessProjection()", msProjGetProjErrorString(p),
p->args[0]);
return (-1);
}
@@ -792,14 +810,13 @@ int msProcessProjection(projectionObj *p) {
fprintf(stderr, "\n");
#endif
if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, numargs, args))) {
- int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx);
if (p->numargs > 1) {
- msSetError(MS_PROJERR, "proj error \"%s\" for \"%s:%s\"",
- "msProcessProjection()", proj_errno_string(l_pj_errno),
+ msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s:%s\"",
+ "msProcessProjection()", msProjGetProjErrorString(p),
p->args[0], p->args[1]);
} else {
- msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"",
- "msProcessProjection()", proj_errno_string(l_pj_errno),
+ msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"",
+ "msProcessProjection()", msProjGetProjErrorString(p),
p->args[0]);
}
free(args);
diff --git a/src/mapraster.c b/src/mapraster.c
index 61c9f8c67a..23a70c58ec 100644
--- a/src/mapraster.c
+++ b/src/mapraster.c
@@ -437,9 +437,11 @@ int msDrawRasterBuildRasterPath(mapObj *map, layerObj *layer,
char szPath[MS_MAXPATHLEN] /* output */) {
/*
** If using a tileindex then build the path relative to that file if SHAPEPATH
- *is not set.
+ * is not set, provided that layer->tileindex does not refer to a layer (to
+ * save a useless file opening attempt)
*/
- if (layer->tileindex && !map->shapepath) {
+ if (layer->tileindex && !map->shapepath &&
+ msGetLayerIndex(map, layer->tileindex) < 0) {
char tiAbsFilePath[MS_MAXPATHLEN];
char *tiAbsDirPath = NULL;
@@ -649,7 +651,6 @@ void *msDrawRasterLayerLowOpenDataset(mapObj *map, layerObj *layer,
GDALOpenEx(*p_decrypted_path, GDAL_OF_RASTER | GDAL_OF_SHARED,
(const char *const *)papszAllowedDrivers,
(const char *const *)connectionoptions, NULL);
- CSLDestroy(papszAllowedDrivers);
CSLDestroy(connectionoptions);
// Give a hint about which GDAL driver should be enabled, but only in
@@ -676,6 +677,7 @@ void *msDrawRasterLayerLowOpenDataset(mapObj *map, layerObj *layer,
}
}
}
+ CSLDestroy(papszAllowedDrivers);
return hDS;
} else {
return GDALOpenShared(*p_decrypted_path, GA_ReadOnly);
diff --git a/src/mapscript/python/CMakeLists.txt b/src/mapscript/python/CMakeLists.txt
index c7cb8a6e47..8bfb39a868 100644
--- a/src/mapscript/python/CMakeLists.txt
+++ b/src/mapscript/python/CMakeLists.txt
@@ -60,32 +60,33 @@ endif()
add_custom_target(
pythonmapscript-wheel
- DEPENDS mapscripttests.stamp
+ DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp
)
add_custom_command(
DEPENDS ${SWIG_MODULE_pythonmapscript_REAL_NAME}
- OUTPUT mapscriptvenv.stamp
+ OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp
WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR}
- COMMAND ${Python_EXECUTABLE} -m pip install pip --upgrade
- COMMAND ${Python_EXECUTABLE} -m pip install virtualenv
- COMMAND ${Python_EXECUTABLE} -m virtualenv mapscriptvenv
- COMMAND ${Python_VENV_SCRIPTS}/pip install -r ${PROJECT_SOURCE_DIR}/src/mapscript/python/requirements-dev.txt > requires.log
+ COMMAND ${Python_EXECUTABLE} -m venv mapscriptvenv
+ COMMAND ${CMAKE_COMMAND} -E env PIP_NO_PYTHON_VERSION_WARNING=1
+ ${Python_VENV_SCRIPTS}/pip install --no-warn-script-location -r ${PROJECT_SOURCE_DIR}/src/mapscript/python/requirements-dev.txt > requires.log
+ COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp
COMMENT "Creating a Python virtual environment and installing the required packages"
)
add_custom_command(
- DEPENDS mapscriptvenv.stamp
- OUTPUT mapscriptwheel.stamp
+ DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp
+ OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp
WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR}
COMMAND ${Python_VENV_SCRIPTS}/python -m build --wheel > wheel_build.log
+ COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp
COMMENT "Building the mapscript Python wheel"
)
add_custom_command(
WORKING_DIRECTORY ${Python_VENV_SCRIPTS} # make sure scripts aren't run when from the same folder as mapscript.py
- DEPENDS mapscriptwheel.stamp
- OUTPUT mapscripttests.stamp
+ DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp
+ OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp
COMMAND ${Python_VENV_SCRIPTS}/pip install --no-index --find-links=${MAPSCRIPT_WORKING_DIR}/dist mapscript
# ERROR: file or package not found: mapscript.tests (missing __init__.py?) is caused by
# ImportError: DLL load failed while importing _mapscript: The specified module could not be found.
@@ -94,6 +95,7 @@ add_custom_command(
COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.shpdump ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpdump.txt
COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.shpinfo ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpinfo.txt
COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.wxs ${PROJECT_SOURCE_DIR}/tests/test.map > response.xml
+ COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp
COMMENT "Installing the Python wheel and testing it in the virtual environment, then running tests and examples"
)
@@ -138,7 +140,7 @@ install(
endif()
execute_process(
- COMMAND ${Python_EXECUTABLE} -m pip install \${PYTHON_ROOT} \${PYTHON_PREFIX} .
+ COMMAND ${Python_EXECUTABLE} -m pip install --no-build-isolation \${PYTHON_ROOT} \${PYTHON_PREFIX} .
WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR}
)
"
diff --git a/src/mapscript/python/requirements-dev.txt b/src/mapscript/python/requirements-dev.txt
index 405e52c12e..2e8e4893af 100644
--- a/src/mapscript/python/requirements-dev.txt
+++ b/src/mapscript/python/requirements-dev.txt
@@ -2,4 +2,4 @@ pytest
pillow
wheel>=0.38.0
setuptools>=45.0.0
-build[virtualenv]
\ No newline at end of file
+build
\ No newline at end of file
diff --git a/src/mapscript/python/tests/cases/thread_test.py b/src/mapscript/python/tests/cases/thread_test.py
index 675bcfcd55..34735b66bf 100644
--- a/src/mapscript/python/tests/cases/thread_test.py
+++ b/src/mapscript/python/tests/cases/thread_test.py
@@ -148,16 +148,15 @@ def draw_map_wms(name, save=0):
# print("making map in thread %s" % (name))
mo = mapscript.mapObj(TESTMAPFILE)
- # WFS layer
+ # WMS layer
lo = mapscript.layerObj()
- lo.name = "jpl_wms"
+ lo.name = "world_latlong"
lo.setProjection("+init=epsg:4326")
lo.connectiontype = mapscript.MS_WMS
- lo.connection = "http://vmap0.tiles.osgeo.org/wms/vmap0?"
+ lo.connection = "https://demo.mapserver.org/cgi-bin/msautotest?"
lo.metadata.set("wms_service", "WMS")
- lo.metadata.set("wms_server_version", "1.1.1")
- lo.metadata.set("wms_name", "basic")
- lo.metadata.set("wms_style", "visual")
+ lo.metadata.set("wms_server_version", "1.3.0")
+ lo.metadata.set("wms_name", "world_latlong")
lo.metadata.set("wms_format", "image/jpeg")
lo.type = mapscript.MS_LAYER_RASTER
lo.status = mapscript.MS_DEFAULT
diff --git a/src/mapserver.h b/src/mapserver.h
index 9581bfe0b5..6239f4e109 100644
--- a/src/mapserver.h
+++ b/src/mapserver.h
@@ -39,6 +39,7 @@
#define _GNU_SOURCE /* Required for strcasestr() defn */
#endif
+#include
#include
#include
#include
@@ -2894,6 +2895,7 @@ MS_DLL_EXPORT int msUTF8ToUniChar(const char *str,
MS_DLL_EXPORT char *msStringEscape(const char *pszString);
MS_DLL_EXPORT int msStringInArray(const char *pszString, char **array,
int numelements);
+void msStringUnescape(char *pszString, char chEscapeChar);
typedef struct msStringBuffer msStringBuffer;
MS_DLL_EXPORT msStringBuffer *msStringBufferAlloc(void);
diff --git a/src/mapshape.c b/src/mapshape.c
index 4d1dd892cc..3704e52e8b 100644
--- a/src/mapshape.c
+++ b/src/mapshape.c
@@ -2939,6 +2939,11 @@ int msSHPLayerOpen(layerObj *layer) {
}
}
+ /* Update layer encoding if encoding is defined in CPG file */
+ if (!layer->encoding && shpfile->hDBF->pszEncoding) {
+ layer->encoding = msStrdup(shpfile->hDBF->pszEncoding);
+ }
+
if (layer->projection.numargs > 0 &&
EQUAL(layer->projection.args[0], "auto")) {
const char *pszPRJFilename = CPLResetExtension(szPath, "prj");
diff --git a/src/mapshape.h b/src/mapshape.h
index c93a9d2283..bac547c00b 100644
--- a/src/mapshape.h
+++ b/src/mapshape.h
@@ -147,6 +147,8 @@ typedef struct {
char *pszStringField;
int nStringFieldLen;
+
+ char *pszEncoding;
#endif /* not SWIG */
} DBFInfo;
diff --git a/src/mapstring.cpp b/src/mapstring.cpp
index 9f076148f6..14e3e45470 100644
--- a/src/mapstring.cpp
+++ b/src/mapstring.cpp
@@ -2528,3 +2528,24 @@ int msStringBufferAppend(msStringBuffer *sb, const char *pszAppendedString) {
sb->length += nAppendLen;
return MS_SUCCESS;
}
+
+/************************************************************************/
+/* msStringUnescape() */
+/************************************************************************/
+
+/** Modify in place pszString such that a sequence of two consecutive
+ * chEscapeChar is replaced by a single one.
+ * Does the reverse of FLTEscapePropertyName()
+ */
+void msStringUnescape(char *pszString, char chEscapeChar) {
+ char *pszDest = pszString;
+ for (; *pszString; ++pszString, ++pszDest) {
+ if (pszString[0] == chEscapeChar && pszString[1] == chEscapeChar) {
+ *pszDest = chEscapeChar;
+ ++pszString;
+ } else {
+ *pszDest = *pszString;
+ }
+ }
+ *pszDest = 0;
+}
diff --git a/src/maptemplate.c b/src/maptemplate.c
index 8abfa9eac6..4e61713052 100644
--- a/src/maptemplate.c
+++ b/src/maptemplate.c
@@ -4060,7 +4060,7 @@ static char *processLine(mapservObj *mapserv, const char *instr, FILE *stream,
char *ol;
#if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \
defined(USE_SOS_SVR) || defined(USE_WMS_LYR) || defined(USE_WFS_LYR)
- ol = msOWSGetOnlineResource(mapserv->map, "O", "onlineresource",
+ ol = msOWSGetOnlineResource(mapserv->map, "MO", "onlineresource",
mapserv->request);
#else
ol = msBuildOnlineResource(mapserv->map, mapserv->request);
diff --git a/src/maptree.c b/src/maptree.c
index 3f053d6ab6..88cf85a9b8 100644
--- a/src/maptree.c
+++ b/src/maptree.c
@@ -734,7 +734,7 @@ static void writeTreeNode(SHPTreeHandle disktree, treeNodeObj *node) {
}
int msWriteTree(treeObj *tree, char *filename, int B_order) {
- char signature[3] = "SQT";
+ char signature[3] = {'S', 'Q', 'T'};
char version = 1;
char reserved[3] = {0, 0, 0};
SHPTreeHandle disktree;
diff --git a/src/maputil.c b/src/maputil.c
index 2777db0518..3dc5743a6d 100644
--- a/src/maputil.c
+++ b/src/maputil.c
@@ -574,6 +574,7 @@ int msValidateContexts(mapObj *map) {
int msEvalContext(mapObj *map, layerObj *layer, char *context) {
int i, status;
char *tag = NULL;
+ tokenListNodeObjPtr token = NULL;
expressionObj e;
parseObj p;
@@ -609,6 +610,24 @@ int msEvalContext(mapObj *map, layerObj *layer, char *context) {
msTokenizeExpression(&e, NULL, NULL);
+ /*
+ * We'll check for binding tokens in the token list. Since there is no shape
+ * to bind to, the parser will crash if any are present.
+ * This is one way to catch references to non-existent layers.
+ */
+ for (token = e.tokens; token; token = token->next) {
+ if (token->token == MS_TOKEN_BINDING_DOUBLE ||
+ token->token == MS_TOKEN_BINDING_STRING ||
+ token->token == MS_TOKEN_BINDING_TIME) {
+ msSetError(MS_PARSEERR,
+ "A non-existent layer is referenced in a LAYER REQUIRES or "
+ "LABELREQUIRES expression: %s",
+ "msEvalContext()", e.string);
+ msFreeExpression(&e);
+ return MS_FALSE;
+ }
+ }
+
p.shape = NULL;
p.expr = &e;
p.expr->curtoken = p.expr->tokens; /* reset */
diff --git a/src/mapwfslayer.c b/src/mapwfslayer.c
index a61a9c10b7..9095f2cd68 100644
--- a/src/mapwfslayer.c
+++ b/src/mapwfslayer.c
@@ -1100,6 +1100,11 @@ int msWFSLayerWhichShapes(layerObj *lp, rectObj rect, int isQuery) {
return MS_FAILURE;
}
+ if (psInfo->nStatus != asReqInfo[0].nStatus) {
+ /* For drawQuery, we may use a copy layer which needs to be updated */
+ msWFSUpdateRequestInfo(lp, &(asReqInfo[0]));
+ }
+
/* Cleanup */
msHTTPFreeRequestObj(asReqInfo, numReq);
}
diff --git a/src/mapwms.cpp b/src/mapwms.cpp
index 98b7db960a..6bb6124ce1 100644
--- a/src/mapwms.cpp
+++ b/src/mapwms.cpp
@@ -500,17 +500,21 @@ static int msWMSApplyFilter(mapObj *map, int version, const char *filter,
/* Apply filter to this layer */
- /* But first, start by removing any wfs_use_default_extent_for_getfeature
- * metadata item */
- /* that could result in the BBOX to be removed */
- std::string old_value_wfs_use_default_extent_for_getfeature;
- {
- const char *old_value_tmp = msLookupHashTable(
- &(lp->metadata), "wfs_use_default_extent_for_getfeature");
- if (old_value_tmp) {
- old_value_wfs_use_default_extent_for_getfeature = old_value_tmp;
- msRemoveHashTable(&(lp->metadata),
- "wfs_use_default_extent_for_getfeature");
+ /* But first, start by removing any use_default_extent_for_getfeature
+ * metadata items that could result in the BBOX to be removed */
+
+ hashTableObj *tmpTable = msCreateHashTable();
+
+ std::vector keys_to_temporarily_remove = {
+ "wfs_use_default_extent_for_getfeature",
+ "ows_use_default_extent_for_getfeature",
+ "oga_use_default_extent_for_getfeature"};
+
+ for (const auto &key : keys_to_temporarily_remove) {
+ const char *value = msLookupHashTable(&(lp->metadata), key.c_str());
+ if (value) {
+ msInsertHashTable(tmpTable, key.c_str(), value);
+ msRemoveHashTable(&(lp->metadata), key.c_str());
}
}
@@ -520,12 +524,15 @@ static int msWMSApplyFilter(mapObj *map, int version, const char *filter,
msRemoveHashTable(&(lp->metadata), "gml_wmsfilter_flag");
- if (!old_value_wfs_use_default_extent_for_getfeature.empty()) {
- msInsertHashTable(
- &(lp->metadata), "wfs_use_default_extent_for_getfeature",
- old_value_wfs_use_default_extent_for_getfeature.c_str());
+ const char *pszKey;
+ pszKey = msFirstKeyFromHashTable(tmpTable);
+ for (; pszKey != NULL; pszKey = msNextKeyFromHashTable(tmpTable, pszKey)) {
+ msInsertHashTable(&(lp->metadata), pszKey,
+ msLookupHashTable(tmpTable, pszKey));
}
+ msFreeHashTable(tmpTable);
+
if (ret != MS_SUCCESS) {
errorObj *ms_error = msGetErrorObj();
@@ -1849,15 +1856,29 @@ this request. Check wms/ows_enable_request settings.",
(lp->group &&
strcasecmp(lp->group, wmslayers[i].c_str()) == 0)) {
bool found = false;
- for (int k = 0; k < lp->numclasses; k++) {
- if (lp->_class[k]->group &&
- strcasecmp(lp->_class[k]->group, tokens[i]) == 0) {
- msFree(lp->classgroup);
- lp->classgroup = msStrdup(tokens[i]);
+
+#ifdef USE_WMS_LYR
+ if (lp->connectiontype == MS_WMS) {
+ const char *pszWmsStyle =
+ msOWSLookupMetadata(&(lp->metadata), "MO", "style");
+ if (pszWmsStyle != NULL &&
+ strcasecmp(pszWmsStyle, tokens[i]) == 0)
found = true;
- break;
+ }
+#endif // USE_WMS_LYR
+
+ if (!found) {
+ for (int k = 0; k < lp->numclasses; k++) {
+ if (lp->_class[k]->group &&
+ strcasecmp(lp->_class[k]->group, tokens[i]) == 0) {
+ msFree(lp->classgroup);
+ lp->classgroup = msStrdup(tokens[i]);
+ found = true;
+ break;
+ }
}
}
+
if (!found) {
msSetErrorWithStatus(MS_WMSERR, MS_HTTP_400_BAD_REQUEST,
"Style (%s) not defined on layer.",
diff --git a/src/mapwmslayer.c b/src/mapwmslayer.c
index 6f3a094d2f..76a42f28a9 100644
--- a/src/mapwmslayer.c
+++ b/src/mapwmslayer.c
@@ -438,6 +438,7 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType,
*pszSrsParamName = "SRS", *pszLayer = NULL, *pszQueryLayers = NULL,
*pszUseStrictAxisOrder;
rectObj bbox;
+ projectionObj layerRequestProjection;
int bbox_width = map->width, bbox_height = map->height;
int nVersion = OWS_VERSION_NOTSET;
int bUseStrictAxisOrder = MS_FALSE; /* this is the assumption up to 1.1.0 */
@@ -642,45 +643,11 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType,
bFlipAxisOrder = MS_TRUE;
}
- /* ------------------------------------------------------------------
- * Set layer SRS.
- * ------------------------------------------------------------------ */
- /* No need to set lp->proj if it's already set to the right EPSG code */
- {
- char *pszEPSGCodeFromLayer = NULL;
- msOWSGetEPSGProj(&(lp->projection), NULL, "MO", MS_TRUE,
- &pszEPSGCodeFromLayer);
- if (pszEPSGCodeFromLayer == NULL ||
- strcasecmp(pszEPSG, pszEPSGCodeFromLayer) != 0) {
- char *ows_srs = NULL;
- msOWSGetEPSGProj(NULL, &(lp->metadata), "MO", MS_FALSE, &ows_srs);
- /* no need to set lp->proj if it is already set and there is only
- one item in the _srs metadata for this layer - we will assume
- the projection block matches the _srs metadata (the search for ' '
- in ows_srs is a test to see if there are multiple EPSG: codes) */
- if (lp->projection.numargs == 0 || ows_srs == NULL ||
- (strchr(ows_srs, ' ') != NULL)) {
- if (strncasecmp(pszEPSG, "EPSG:", 5) == 0) {
- char szProj[20];
- snprintf(szProj, sizeof(szProj), "init=epsg:%s", pszEPSG + 5);
- if (msLoadProjectionString(&(lp->projection), szProj) != 0) {
- msFree(pszEPSGCodeFromLayer);
- msFree(ows_srs);
- free(pszEPSG);
- return MS_FAILURE;
- }
- } else {
- if (msLoadProjectionString(&(lp->projection), pszEPSG) != 0) {
- msFree(pszEPSGCodeFromLayer);
- msFree(ows_srs);
- free(pszEPSG);
- return MS_FAILURE;
- }
- }
- }
- msFree(ows_srs);
- }
- msFree(pszEPSGCodeFromLayer);
+ msInitProjection(&layerRequestProjection);
+ if (msLoadProjectionString(&layerRequestProjection, pszEPSG) != 0) {
+ free(pszEPSG);
+ msFreeProjection(&layerRequestProjection);
+ return MS_FAILURE;
}
/* ------------------------------------------------------------------
@@ -697,8 +664,8 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType,
/* -------------------------------------------------------------------- */
/* Reproject if needed. */
/* -------------------------------------------------------------------- */
- if (msProjectionsDiffer(&(map->projection), &(lp->projection))) {
- msProjectRect(&(map->projection), &(lp->projection), &bbox);
+ if (msProjectionsDiffer(&(map->projection), &layerRequestProjection)) {
+ msProjectRect(&(map->projection), &layerRequestProjection, &bbox);
/* -------------------------------------------------------------------- */
/* Sometimes our remote WMS only accepts square pixel */
@@ -755,7 +722,8 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType,
&ows_srs);
if (ows_srs && strchr(ows_srs, ' ') == NULL &&
- msOWSGetLayerExtent(map, lp, "MO", &layer_rect) == MS_SUCCESS) {
+ msOWSGetLayerExtent(map, lp, "MO", &layer_rect) == MS_SUCCESS &&
+ !msProjectionsDiffer(&(lp->projection), &layerRequestProjection)) {
/* fulloverlap */
if (msRectContained(&bbox, &layer_rect)) {
/* no changes */
@@ -787,9 +755,6 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType,
msFree(ows_srs);
}
- /* Set layer extent to wms bbox */
- lp->extent = bbox;
-
/* -------------------------------------------------------------------- */
/* Potentially return the bbox. */
/* -------------------------------------------------------------------- */
@@ -980,7 +945,7 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType,
}
free(pszEPSG);
-
+ msFreeProjection(&layerRequestProjection);
return MS_SUCCESS;
#else
@@ -1038,6 +1003,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
char *pszURL = NULL, *pszHTTPCookieData = NULL;
const char *pszTmp;
rectObj bbox = {0};
+ projectionObj lyrRequestProjection;
+ const char *pszEPSG;
int bbox_width = 0, bbox_height = 0;
int nTimeout, bOkToMerge, bForceSeparateRequest, bCacheToDisk;
wmsParamsObj sThisWMSParams;
@@ -1049,8 +1016,7 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
msInitWmsParamsObj(&sThisWMSParams);
/* ------------------------------------------------------------------
- * Build the request URL, this will also set layer projection and
- * compute BBOX in that projection.
+ * Build the request URL
* ------------------------------------------------------------------ */
switch (nRequestType) {
@@ -1081,12 +1047,31 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
return MS_FAILURE;
}
+ /* Load projection that we will request, it may differ from current layer
+ * projection */
+ char *srsKeys[] = {"SRS", "CRS"};
+ int i;
+ for (i = 0; i < 2; i++) {
+ pszEPSG = msLookupHashTable(sThisWMSParams.params, srsKeys[i]);
+ if (pszEPSG != NULL && strlen(pszEPSG) > 0)
+ break;
+ }
+
+ msInitProjection(&lyrRequestProjection);
+ if (pszEPSG == NULL || msLoadProjectionStringEPSG(&lyrRequestProjection,
+ pszEPSG) != MS_SUCCESS) {
+ msFreeWmsParamsObj(&sThisWMSParams);
+ msFreeProjection(&lyrRequestProjection);
+ return MS_FAILURE;
+ }
+
/* ------------------------------------------------------------------
* Check if the request is empty, perhaps due to reprojection problems
* or wms_extents restrictions.
* ------------------------------------------------------------------ */
if ((nRequestType == WMS_GETMAP) && (bbox_width == 0 || bbox_height == 0)) {
msFreeWmsParamsObj(&sThisWMSParams);
+ msFreeProjection(&lyrRequestProjection);
return MS_SUCCESS; /* No overlap. */
}
@@ -1119,10 +1104,10 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
/* Reproject latlonboundingbox to the selected SRS for the layer and */
/* check if it overlaps the bbox that we calculated for the request */
- msProjectRect(&(map->latlon), &(lp->projection), &ext);
+ msProjectRect(&(map->latlon), &lyrRequestProjection, &ext);
if (!msRectOverlap(&bbox, &ext)) {
/* No overlap... nothing to do */
-
+ msFreeProjection(&lyrRequestProjection);
msFreeWmsParamsObj(&sThisWMSParams);
return MS_SUCCESS; /* No overlap. */
}
@@ -1158,6 +1143,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
msSetError(MS_WMSERR,
"WEB.IMAGEPATH must be set to use WMS client connections.",
"msPrepareWMSLayerRequest()");
+ msFreeProjection(&lyrRequestProjection);
+ msFreeWmsParamsObj(&sThisWMSParams);
return MS_FAILURE;
}
}
@@ -1300,6 +1287,7 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
pasReqInfo[(*numRequests)].width = bbox_width;
pasReqInfo[(*numRequests)].height = bbox_height;
pasReqInfo[(*numRequests)].debug = lp->debug;
+ pasReqInfo[(*numRequests)].pszEPSG = msStrdup(pszEPSG);
if (msHTTPAuthProxySetup(&(map->web.metadata), &(lp->metadata), pasReqInfo,
*numRequests, map, "MO") != MS_SUCCESS)
@@ -1323,6 +1311,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp,
msFreeWmsParamsObj(&sThisWMSParams);
}
+ msFreeProjection(&lyrRequestProjection);
+
return MS_SUCCESS;
#else
@@ -1349,6 +1339,8 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests,
char szPath[MS_MAXPATHLEN];
int currenttype;
int currentconnectiontype;
+ projectionObj currentprojectionobject;
+ rectObj currentextent;
int numclasses;
char *mem_filename = NULL;
const char *pszTmp;
@@ -1472,12 +1464,35 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests,
* Prepare layer for drawing, reprojecting the image received from the
* server if needed...
* ------------------------------------------------------------------ */
+
+ // Aassign requested projection temporarily to layer
+ currentprojectionobject = lp->projection;
+ msInitProjection(&(lp->projection));
+ if (pasReqInfo[iReq].pszEPSG == NULL ||
+ msLoadProjectionString(&(lp->projection), pasReqInfo[iReq].pszEPSG) !=
+ MS_SUCCESS) {
+ msSetError(
+ MS_WMSERR, "WMS GetMap failed to load projection for layer '%s': %s.",
+ "msDrawWMSLayerLow()", (lp->name ? lp->name : "(null)"),
+ (pasReqInfo[iReq].pszEPSG ? pasReqInfo[iReq].pszEPSG : "(null)"));
+
+ // Restore layer projection
+ msFreeProjection(&(lp->projection));
+ lp->projection = currentprojectionobject;
+ if (!bIsEssential)
+ return MS_SUCCESS;
+ else
+ return MS_FAILURE;
+ }
+
/* keep the current type that will be restored at the end of this */
/* function. */
currenttype = lp->type;
currentconnectiontype = lp->connectiontype;
+ currentextent = lp->extent;
lp->type = MS_LAYER_RASTER;
lp->connectiontype = MS_RASTER;
+ lp->extent = pasReqInfo[iReq].bbox;
/* set the classes to 0 so that It won't do client side */
/* classification if an sld was set. */
@@ -1569,6 +1584,10 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests,
/* restore prveious type */
lp->type = currenttype;
lp->connectiontype = currentconnectiontype;
+ lp->extent = currentextent;
+
+ msFreeProjection(&(lp->projection));
+ lp->projection = currentprojectionobject;
/* restore previous numclasses */
lp->numclasses = numclasses;
diff --git a/src/mapxbase.c b/src/mapxbase.c
index dd61df6463..d757a9ca6a 100644
--- a/src/mapxbase.c
+++ b/src/mapxbase.c
@@ -144,6 +144,8 @@ DBFHandle msDBFOpenVirtualFile(VSILFILE *fp) {
psDBF->pszStringField = NULL;
psDBF->nStringFieldLen = 0;
+ psDBF->pszEncoding = NULL;
+
/* -------------------------------------------------------------------- */
/* Read Table Header info */
/* -------------------------------------------------------------------- */
@@ -219,6 +221,59 @@ DBFHandle msDBFOpenVirtualFile(VSILFILE *fp) {
return (psDBF);
}
+/**
+ * Attempt to read character encoding from a .CPG-file
+ */
+char *msReadCPGEncoding(char *cpgFilename) {
+ VSILFILE *fpCPG = VSIFOpenL(cpgFilename, "rb");
+ if (fpCPG == NULL)
+ return NULL;
+
+ char szEncoding[100] = "";
+ size_t nRead = VSIFReadL(szEncoding, 1, sizeof(szEncoding) - 1, fpCPG);
+ VSIFCloseL(fpCPG);
+
+ if (nRead == 0)
+ return NULL;
+
+ // Null terminate and remove any line break
+ szEncoding[nRead] = '\0';
+ szEncoding[strcspn(szEncoding, "\r\n")] = 0;
+
+ if (szEncoding[0] == '\0') {
+ return NULL;
+ }
+
+ /* See
+ * https://github.com/OSGeo/gdal/blob/release/3.11/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp#L503
+ */
+ const int nCPG = atoi(szEncoding);
+ if ((nCPG >= 437 && nCPG <= 950) || (nCPG >= 1250 && nCPG <= 1258)) {
+ char szResult[20];
+ snprintf(szResult, sizeof(szResult), "CP%d", nCPG);
+ return msStrdup(szResult);
+ }
+
+ if (strncasecmp(szEncoding, "8859", 4) == 0) {
+ const char *suffix = szEncoding + 4;
+ if (*suffix == '-' || *suffix == '_')
+ suffix++;
+
+ if (!isdigit((unsigned char)*suffix))
+ return msStrdup(szEncoding);
+
+ char szResult[40];
+ snprintf(szResult, sizeof(szResult), "ISO-8859-%d", atoi(suffix));
+ return msStrdup(szResult);
+ }
+
+ if (strncasecmp(szEncoding, "ANSI 1251", 9) == 0) {
+ return msStrdup("CP1251");
+ }
+
+ return msStrdup(szEncoding);
+}
+
/************************************************************************/
/* msDBFOpen() */
/* */
@@ -259,12 +314,30 @@ DBFHandle msDBFOpen(const char *pszFilename, const char *pszAccess)
fp = VSIFOpenL(pszDBFFilename, pszAccess);
}
}
- msFree(pszDBFFilename);
+
if (fp == NULL) {
+ msFree(pszDBFFilename);
return (NULL);
}
- return msDBFOpenVirtualFile(fp);
+ DBFHandle dbfHandle = msDBFOpenVirtualFile(fp);
+ if (dbfHandle) {
+ char *pszCPGFilename = (char *)msSmallMalloc(strlen(pszDBFFilename) + 1);
+ strcpy(pszCPGFilename, pszDBFFilename);
+
+ if (strcmp(pszDBFFilename + strlen(pszDBFFilename) - 4, ".dbf") == 0) {
+ strcpy(pszCPGFilename + strlen(pszCPGFilename) - 4, ".cpg");
+ } else {
+ strcpy(pszCPGFilename + strlen(pszCPGFilename) - 4, ".CPG");
+ }
+
+ dbfHandle->pszEncoding = msReadCPGEncoding(pszCPGFilename);
+
+ msFree(pszCPGFilename);
+ }
+
+ msFree(pszDBFFilename);
+ return dbfHandle;
}
/************************************************************************/
@@ -319,6 +392,7 @@ void msDBFClose(DBFHandle psDBF) {
free(psDBF->pszCurrentRecord);
free(psDBF->pszStringField);
+ free(psDBF->pszEncoding);
free(psDBF);
}