diff -Nru proj-9.0.0/cmake/project-config.cmake.in proj-9.0.1/cmake/project-config.cmake.in --- proj-9.0.0/cmake/project-config.cmake.in 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/cmake/project-config.cmake.in 2022-06-08 15:59:53.000000000 +0000 @@ -8,6 +8,12 @@ # @PROJECT_VARIANT_NAME@_BINARY_DIRS = /usr/local/bin # @PROJECT_VARIANT_NAME@_VERSION = 4.9.1 (for example) +include(CMakeFindDependencyMacro) +if("@CURL_ENABLED@" STREQUAL "TRUE") + # Chainload CURL usage requirements + find_dependency(CURL) +endif() + # Tell the user project where to find our headers and libraries get_filename_component (_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) get_filename_component (_ROOT "${_DIR}/@PROJECT_ROOT_DIR@" ABSOLUTE) diff -Nru proj-9.0.0/cmake/ProjInstallPath.cmake proj-9.0.1/cmake/ProjInstallPath.cmake --- proj-9.0.0/cmake/ProjInstallPath.cmake 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/cmake/ProjInstallPath.cmake 2022-06-08 15:59:53.000000000 +0000 @@ -23,7 +23,7 @@ # for data install testing the PROJ_LIB envVar string(TOLOWER "${PROJECT_NAME}" PROJECT_NAME_LOWER) -if(UNIX) +if(UNIX OR MINGW) include(GNUInstallDirs) set(DEFAULT_BIN_SUBDIR ${CMAKE_INSTALL_BINDIR}) set(DEFAULT_LIB_SUBDIR ${CMAKE_INSTALL_LIBDIR}) diff -Nru proj-9.0.0/cmake/ProjTest.cmake proj-9.0.1/cmake/ProjTest.cmake --- proj-9.0.0/cmake/ProjTest.cmake 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/cmake/ProjTest.cmake 2022-03-25 07:13:55.000000000 +0000 @@ -39,6 +39,7 @@ # Create user writable directory for tests add_custom_target(create_tmp_user_writable_dir ALL + COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJ_BINARY_DIR}/tmp_user_writable_dir COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJ_BINARY_DIR}/tmp_user_writable_dir) function(proj_add_gie_network_dependent_test TESTNAME TESTCASE) diff -Nru proj-9.0.0/cmake/ProjUtilities.cmake proj-9.0.1/cmake/ProjUtilities.cmake --- proj-9.0.0/cmake/ProjUtilities.cmake 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/cmake/ProjUtilities.cmake 2022-06-08 15:59:53.000000000 +0000 @@ -98,7 +98,7 @@ list(APPEND EXTRA_LIBS -lole32 -lshell32) else() set(cxx_libs "${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES}") - list(REMOVE_ITEM cxx_libs ${CMAKE_C_IMPLICIT_LINK_LIBRARIES}) + list(REMOVE_ITEM cxx_libs ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} nonempty) foreach(lib IN LISTS cxx_libs) list(APPEND EXTRA_LIBS "-l${lib}") endforeach() diff -Nru proj-9.0.0/CMakeLists.txt proj-9.0.1/CMakeLists.txt --- proj-9.0.0/CMakeLists.txt 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/CMakeLists.txt 2022-06-08 17:16:53.000000000 +0000 @@ -73,6 +73,11 @@ /wd4706 # Suppress warning about assignment within conditional expression /wd4996 # Suppress warning about sprintf, etc., being unsafe ) + if("$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64") + # Suppress an inaccurate warning when compiling for an MSVC/ARM64 platform + # It incorrectly assumes a division by zero is possible despite a check + set(PROJ_C_WARN_FLAGS ${PROJ_C_WARN_FLAGS} /wd4723) + endif() set(PROJ_CXX_WARN_FLAGS /EHsc ${PROJ_C_WARN_FLAGS}) elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel") if(MSVC) @@ -110,7 +115,7 @@ #PROJ version information ################################################################################ include(ProjVersion) -proj_version(MAJOR 9 MINOR 0 PATCH 0) +proj_version(MAJOR 9 MINOR 0 PATCH 1) set(PROJ_SOVERSION 25) set(PROJ_BUILD_VERSION "${PROJ_SOVERSION}.${PROJ_VERSION}") @@ -330,7 +335,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/proj.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + DESTINATION ${LIBDIR}/pkgconfig) ################################################################################ # "make dist" workalike diff -Nru proj-9.0.0/data/ITRF2014 proj-9.0.1/data/ITRF2014 --- proj-9.0.0/data/ITRF2014 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/ITRF2014 2022-04-29 18:18:53.000000000 +0000 @@ -9,9 +9,9 @@ +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +d=0.0038 +rz=0.00026 +dx0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +t_epoch=2010.0 +convention=position_vector + +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +t_epoch=2010.0 +convention=position_vector + +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector +proj=helmert +x=-0.0504 +y=0.0033 +z=-0.0602 +s=0.00429 +rx=-0.00281 +ry=-0.00338 +rz=0.0004 +dx=-0.0028 +dy=-0.0001 +dz=-0.0025 +ds=0.00012 +drx=-0.00011 +dry=-0.00019 +drz=0.00007 +t_epoch=2010.0 +convention=position_vector @@ -23,7 +23,7 @@ +proj=helmert +x=0.0304 +y=0.0355 +z=-0.1308 +s=0.00819 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - +proj=helmert +x=0.0254 +y=-0.0005 +z=-0.1548 +s=0.01129 +rx=0.0001 +rz= +dx=0.00026 +dy=0.0001 +dx=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector + +proj=helmert +x=0.0254 +y=-0.0005 +z=-0.1548 +s=0.01129 +rx=0.0001 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector # ITRF2014 Plate Motion Model parameters # diff -Nru proj-9.0.0/data/sql/alias_name.sql proj-9.0.1/data/sql/alias_name.sql --- proj-9.0.0/data/sql/alias_name.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/alias_name.sql 2022-06-07 18:31:42.000000000 +0000 @@ -655,6 +655,11 @@ INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','5172','Nivellement General du Luxembourg','EPSG'); INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1316','GNTRANS2003','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1319','EBBWV14-IRF','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1317','HULLEE13-IRF','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1320','SCM22-IRF','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1321','FNL22-IRF','EPSG'); +INSERT INTO "alias_name" VALUES('geodetic_datum','EPSG','1322','ITRF2020','EPSG'); +INSERT INTO "alias_name" VALUES('vertical_datum','EPSG','1323','SVD2006','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','21100','Genuk / NEIEZ','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2140','NAD83(CSRS98) / SCoPQ zone 3','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','2141','NAD83(CSRS98) / SCoPQ zone 4','EPSG'); @@ -4889,9 +4894,7 @@ INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','8053','mean sea level depth (ftUS)','EPSG'); INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','8053','msl depth (ftUS)','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8067','NAD83(2011) / PCCS west zone(ft)','EPSG'); -INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8082','NAD83(CSRS)v6 / MTM NS zone 4','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8068','NAD83(2011) / PCCS Mt. Lemmon zone(ft)','EPSG'); -INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8083','NAD83(CSRS)v6 / MTM NS zone 5','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8090','WISCRS Florence (m)','EPSG'); INSERT INTO "alias_name" VALUES('geodetic_crs','EPSG','4974','SIRGAS95 - XYZ','EPSG'); INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8091','WISCRS Florence (ftUS)','EPSG'); @@ -7515,3 +7518,183 @@ INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9944','ETRS89 / EBBWV14 SnakeGrid + Newlyn height','EPSG'); INSERT INTO "alias_name" VALUES('compound_crs','EPSG','6190','BD72 / Belgian Lambert 72 + Oostende height','EPSG'); INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9907','ETRS89 + Oostende height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','32159','NAD83 / WyLam','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9967','ETRS89 / HULLEE13 SnakeGrid','EPSG'); +INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9968','ETRS89 / HULLEE13 SnakeGrid + Newlyn height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9972','ETRS89 / SCM22 SnakeGrid','EPSG'); +INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9973','ETRS89 / SCM22 SnakeGrid + Newlyn height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9977','ETRS89 / FNL22 SnakeGrid','EPSG'); +INSERT INTO "alias_name" VALUES('compound_crs','EPSG','9978','ETRS89 / FNL22 SnakeGrid + Newlyn height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9945','MGI 1901 / Macedonia GK truncated','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9945','MGI 1901 / Macedonia Gauss-Kruger truncated','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','9945','MSCS truncated','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8082','NAD83(CSRS)v6 / MTM Nova Scotia zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8082','NAD83(CSRS) 2010 / MTM NS zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8083','NAD83(CSRS)v6 / MTM Nova Scotia zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','8083','NAD83(CSRS) 2010 / MTM NS zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22351','NAD83(CSRS) 1997 / MTM zone 11','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22352','NAD83(CSRS) 1997 / MTM zone 12','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22353','NAD83(CSRS) 1997 / MTM zone 13','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22354','NAD83(CSRS) 1997 / MTM zone 14','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22355','NAD83(CSRS) 1997 / MTM zone 15','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22356','NAD83(CSRS) 1997 / MTM zone 16','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22357','NAD83(CSRS) 1997 / MTM zone 17','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22651','NAD83(CSRS) 2010 / MTM zone 11','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22652','NAD83(CSRS) 2010 / MTM zone 12','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22653','NAD83(CSRS) 2010 / MTM zone 13','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22654','NAD83(CSRS) 2010 / MTM zone 14','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22655','NAD83(CSRS) 2010 / MTM zone 15','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22656','NAD83(CSRS) 2010 / MTM zone 16','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22657','NAD83(CSRS) 2010 / MTM zone 17','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22462','NAD83(CSRS) 2002 / Alberta 3TM ref merid 111','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22463','NAD83(CSRS) 2002 / Alberta 3TM ref merid 114','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22464','NAD83(CSRS) 2002 / Alberta 3TM ref merid 117','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22465','NAD83(CSRS) 2002 / Alberta 3TM ref merid 120','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22762','NAD83(CSRS) 2010 / Alberta 3TM ref merid 111','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22763','NAD83(CSRS) 2010 / Alberta 3TM ref merid 114','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22764','NAD83(CSRS) 2010 / Alberta 3TM ref merid 117','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22765','NAD83(CSRS) 2010 / Alberta 3TM ref merid 120','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22641','NAD83(CSRS) 2010 / MTM zone 1','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22642','NAD83(CSRS) 2010 / MTM zone 2','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22643','NAD83(CSRS) 2010 / MTM zone 3','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22644','NAD83(CSRS) 2010 / MTM zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22645','NAD83(CSRS) 2010 / MTM zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22646','NAD83(CSRS) 2010 / MTM zone 6','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22739','NAD83(CSRS) 2010 / PEI Stereographic','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22648','NAD83(CSRS) 2010 / MTM zone 8','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22649','NAD83(CSRS) 2010 / MTM zone 9','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22650','NAD83(CSRS) 2010 / MTM zone 10','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22307','NAD83(CSRS) 1997 / UTM zone 7N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22607','NAD83(CSRS) 2010 / UTM zone 7N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22707','NAD83(CSRS) 2010 / UTM zone 7N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22407','NAD83(CSRS) 2002 / UTM zone 7N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22409','NAD83(CSRS) 2002 / UTM zone 9N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22609','NAD83(CSRS) 2010 / UTM zone 9N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22709','NAD83(CSRS) 2010 / UTM zone 9N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22309','NAD83(CSRS) 1997 / UTM zone 9N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22311','NAD83(CSRS) 1997 / UTM zone 11N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22411','NAD83(CSRS) 2002 / UTM zone 11N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22611','NAD83(CSRS) 2010 / UTM zone 11N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22711','NAD83(CSRS) 2010 / UTM zone 11N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22312','NAD83(CSRS) 1997 / UTM zone 12N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22412','NAD83(CSRS) 2002 / UTM zone 12N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22712','NAD83(CSRS) 2010 / UTM zone 12N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22612','NAD83(CSRS) 2010 / UTM zone 12N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22313','NAD83(CSRS) 1997 / UTM zone 13N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22413','NAD83(CSRS) 2002 / UTM zone 13N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22613','NAD83(CSRS) 2010 / UTM zone 13N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22713','NAD83(CSRS) 2010 / UTM zone 13N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22314','NAD83(CSRS) 1997 / UTM zone 14N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22414','NAD83(CSRS) 2002 / UTM zone 14N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22614','NAD83(CSRS) 2010 / UTM zone 14N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22714','NAD83(CSRS) 2010 / UTM zone 14N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22315','NAD83(CSRS) 1997 / UTM zone 15N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22615','NAD83(CSRS) 2010 / UTM zone 15N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22715','NAD83(CSRS) 2010 / UTM zone 15N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22317','NAD83(CSRS) 1997 / UTM zone 17N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22417','NAD83(CSRS) 2002 / UTM zone 17N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22617','NAD83(CSRS) 2010 / UTM zone 17N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22717','NAD83(CSRS) 2010 / UTM zone 17N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22318','NAD83(CSRS) 1997 / UTM zone 18N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22418','NAD83(CSRS) 2002 / UTM zone 18N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22618','NAD83(CSRS) 2010 / UTM zone 18N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22718','NAD83(CSRS) 2010 / UTM zone 18N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22415','NAD83(CSRS) 2002 / UTM zone 15N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22316','NAD83(CSRS) 1997 / UTM zone 16N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22416','NAD83(CSRS) 2002 / UTM zone 16N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22616','NAD83(CSRS) 2010 / UTM zone 16N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22716','NAD83(CSRS) 2010 / UTM zone 16N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22308','NAD83(CSRS) 1997 / UTM zone 8N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22408','NAD83(CSRS) 2002 / UTM zone 8N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22608','NAD83(CSRS) 2010 / UTM zone 8N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22708','NAD83(CSRS) 2010 / UTM zone 8N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22310','NAD83(CSRS) 1997 / UTM zone 10N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22410','NAD83(CSRS) 2002 / UTM zone 10N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22610','NAD83(CSRS) 2010 / UTM zone 10N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22710','NAD83(CSRS) 2010 / UTM zone 10N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22319','NAD83(CSRS) 1997 / UTM zone 19N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22419','NAD83(CSRS) 2002 / UTM zone 19N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22619','NAD83(CSRS) 2010 / UTM zone 19N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22719','NAD83(CSRS) 2010 / UTM zone 19N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22320','NAD83(CSRS) 1997 / UTM zone 20N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22420','NAD83(CSRS) 2002 / UTM zone 20N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22620','NAD83(CSRS) 2010 / UTM zone 20N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22720','NAD83(CSRS) 2010 / UTM zone 20N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22321','NAD83(CSRS) 1997 / UTM zone 21N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22421','NAD83(CSRS) 2002 / UTM zone 21N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22621','NAD83(CSRS) 2010 / UTM zone 21N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22721','NAD83(CSRS) 2010 / UTM zone 21N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22322','NAD83(CSRS) 1997 / UTM zone 22N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22422','NAD83(CSRS) 2002 / UTM zone 22N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22622','NAD83(CSRS) 2010 / UTM zone 22N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22722','NAD83(CSRS) 2010 / UTM zone 22N','EPSG'); +INSERT INTO "alias_name" VALUES('vertical_crs','EPSG','20000','SVD2006Height','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22219','NAD83(CSRS) 1997 / UTM zone 19N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22219','NAD83(CSRS98) / UTM zone 19N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22220','NAD83(CSRS) 1997 / UTM zone 20N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22220','NAD83(CSRS98) / UTM zone 20N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22221','NAD83(CSRS) 1997 / UTM zone 21N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22221','NAD83(CSRS98) / UTM zone 21N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22222','NAD83(CSRS) 1997 / UTM zone 22N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22222','NAD83(CSRS98) / UTM zone 22N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22213','NAD83(CSRS) 1997 / UTM zone 13N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22213','NAD83 / UTM extended zone 13','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22213','NAD83(CSRS98) / UTM zone 13N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22214','NAD83(CSRS) 1997 / UTM zone 14N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22214','NAD83(CSRS98) / UTM zone 14N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22215','NAD83(CSRS) 1997 / UTM zone 15N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22215','NAD83(CSRS98) / UTM zone 15N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22216','NAD83(CSRS) 1997 / UTM zone 16N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22216','NAD83(CSRS98) / UTM zone 16N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22217','NAD83(CSRS) 1997 / UTM zone 17N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22217','NAD83(CSRS98) / UTM zone 17N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22218','NAD83(CSRS) 1997 / UTM zone 18N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22218','NAD83(CSRS98) / UTM zone 18N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22207','NAD83(CSRS) 1997 / UTM zone 7N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22207','NAD83(CSRS98) / UTM zone 7N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22208','NAD83(CSRS) 1997 / UTM zone 8N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22208','NAD83(CSRS98) / UTM zone 8N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22209','NAD83(CSRS) 1997 / UTM zone 9N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22209','NAD83(CSRS98) / UTM zone 9N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22210','NAD83(CSRS) 1997 / UTM zone 10N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22210','NAD83(CSRS98) / UTM zone 10N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22211','NAD83(CSRS) 1997 / UTM zone 11N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22211','NAD83(CSRS98) / UTM zone 11N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22212','NAD83(CSRS) 1997 / UTM zone 12N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22212','NAD83(CSRS98) / UTM zone 12N','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22262','NAD83(CSRS) 1997 / Alberta 3TM ref merid 111','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22262','NAD83(CSRS98) / Alberta 3TM ref merid 111','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22263','NAD83(CSRS) 1997 / Alberta 3TM ref merid 114','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22263','NAD83(CSRS98) / Alberta 3TM ref merid 114','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22264','NAD83(CSRS) 1997 / Alberta 3TM ref merid 117','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22264','NAD83(CSRS98) / Alberta 3TM ref merid 117','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22265','NAD83(CSRS) 1997 / Alberta 3TM ref merid 120','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22265','NAD83(CSRS98) / Alberta 3TM ref merid 120','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22337','NAD83(CSRS)v3 / MTM Nova Scotia zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22337','NAD83(CSRS) 1997 / MTM NS zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22338','NAD83(CSRS)v3 / MTM Nova Scotia zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22338','NAD83(CSRS) 1997 / MTM NS zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22239','NAD83(CSRS) 1997 / PEI Stereographic','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22239','NAD83(CSRS98) / PEI Stereographic','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22240','NAD83(CSRS) 1997 / NB Stereographic','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22240','NAD83(CSRS98) / NB Stereographic','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22243','NAD83(CSRS) 1997 / MTM zone 3','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22243','NAD83(CSRS98) / SCoPQ zone 3','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22244','NAD83(CSRS) 1997 / MTM zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22244','NAD83(CSRS98) / SCoPQ zone 4','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22245','NAD83(CSRS) 1997 / MTM zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22245','NAD83(CSRS98) / SCoPQ zone 5','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22246','NAD83(CSRS) 1997 / MTM zone 6','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22246','NAD83(CSRS98) / SCoPQ zone 6','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22247','NAD83(CSRS) 1997 / MTM zone 7','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22247','NAD83(CSRS98) / SCoPQ zone 7','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22639','NAD83(CSRS) 2010 / PEI Stereographic','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22348','NAD83(CSRS) 1997 / MTM zone 8','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22349','NAD83(CSRS) 1997 / MTM zone 9','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22350','NAD83(CSRS) 1997 / MTM zone 10','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22248','NAD83(CSRS) 1997 / MTM zone 8','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22248','NAD83(CSRS98) / SCoPQ zone 8','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22249','NAD83(CSRS) 1997 / MTM zone 9','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22249','NAD83(CSRS98) / SCoPQ zone 9','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22250','NAD83(CSRS) 1997 / MTM zone 10','EPSG'); +INSERT INTO "alias_name" VALUES('projected_crs','EPSG','22250','NAD83(CSRS98) / SCoPQ zone 10','EPSG'); diff -Nru proj-9.0.0/data/sql/compound_crs.sql proj-9.0.1/data/sql/compound_crs.sql --- proj-9.0.0/data/sql/compound_crs.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/compound_crs.sql 2022-06-07 18:31:42.000000000 +0000 @@ -752,3 +752,23 @@ INSERT INTO "usage" VALUES('EPSG','17296','compound_crs','EPSG','9935','EPSG','3998','EPSG','1141'); INSERT INTO "compound_crs" VALUES('EPSG','9944','EBBWV14 Grid + ODN height',NULL,'EPSG','9943','EPSG','5701',0); INSERT INTO "usage" VALUES('EPSG','17350','compound_crs','EPSG','9944','EPSG','4661','EPSG','1141'); +INSERT INTO "compound_crs" VALUES('EPSG','9948','ISN93 + ISH2004 height ',NULL,'EPSG','4659','EPSG','8089',0); +INSERT INTO "usage" VALUES('EPSG','17415','compound_crs','EPSG','9948','EPSG','4662','EPSG','1026'); +INSERT INTO "compound_crs" VALUES('EPSG','9949','ISN2004 + ISH2004 height',NULL,'EPSG','5324','EPSG','8089',0); +INSERT INTO "usage" VALUES('EPSG','17390','compound_crs','EPSG','9949','EPSG','4662','EPSG','1026'); +INSERT INTO "compound_crs" VALUES('EPSG','9950','ISN2016 + ISH2004 height',NULL,'EPSG','8086','EPSG','8089',0); +INSERT INTO "usage" VALUES('EPSG','17381','compound_crs','EPSG','9950','EPSG','4662','EPSG','1026'); +INSERT INTO "compound_crs" VALUES('EPSG','9951','ISN93 / Lambert 1993 + ISH2004 height',NULL,'EPSG','3057','EPSG','8089',0); +INSERT INTO "usage" VALUES('EPSG','17382','compound_crs','EPSG','9951','EPSG','4662','EPSG','1056'); +INSERT INTO "compound_crs" VALUES('EPSG','9952','ISN2004 / Lambert 2004 + ISH2004 height',NULL,'EPSG','5325','EPSG','8089',0); +INSERT INTO "usage" VALUES('EPSG','17383','compound_crs','EPSG','9952','EPSG','4662','EPSG','1056'); +INSERT INTO "compound_crs" VALUES('EPSG','9953','ISN2016 / Lambert 2016 + ISH2004 height',NULL,'EPSG','8088','EPSG','8089',0); +INSERT INTO "usage" VALUES('EPSG','17384','compound_crs','EPSG','9953','EPSG','4662','EPSG','1056'); +INSERT INTO "compound_crs" VALUES('EPSG','9968','HULLEE13 Grid + ODN height',NULL,'EPSG','9967','EPSG','5701',0); +INSERT INTO "usage" VALUES('EPSG','17430','compound_crs','EPSG','9968','EPSG','4663','EPSG','1141'); +INSERT INTO "compound_crs" VALUES('EPSG','9973','SCM22 Grid + ODN height',NULL,'EPSG','9972','EPSG','5701',0); +INSERT INTO "usage" VALUES('EPSG','17442','compound_crs','EPSG','9973','EPSG','4665','EPSG','1141'); +INSERT INTO "compound_crs" VALUES('EPSG','9978','FNL22 Grid + ODN height',NULL,'EPSG','9977','EPSG','5701',0); +INSERT INTO "usage" VALUES('EPSG','17459','compound_crs','EPSG','9978','EPSG','4664','EPSG','1141'); +INSERT INTO "compound_crs" VALUES('EPSG','20001','ETRS89 + SVD2006 height',NULL,'EPSG','4258','EPSG','20000',0); +INSERT INTO "usage" VALUES('EPSG','17956','compound_crs','EPSG','20001','EPSG','4058','EPSG','1026'); diff -Nru proj-9.0.0/data/sql/conversion.sql proj-9.0.1/data/sql/conversion.sql --- proj-9.0.0/data/sql/conversion.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/conversion.sql 2022-06-07 18:31:42.000000000 +0000 @@ -618,8 +618,8 @@ INSERT INTO "usage" VALUES('EPSG','9643','conversion','EPSG','6198','EPSG','1724','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','6199','Michigan CS27 South zone','','EPSG','1051','Lambert Conic Conformal (2SP Michigan)','EPSG','8821','Latitude of false origin',41.3,'EPSG','9110','EPSG','8822','Longitude of false origin',-84.2,'EPSG','9110','EPSG','8823','Latitude of 1st standard parallel',42.06,'EPSG','9110','EPSG','8824','Latitude of 2nd standard parallel',43.4,'EPSG','9110','EPSG','8826','Easting at false origin',2000000.0,'EPSG','9003','EPSG','8827','Northing at false origin',0.0,'EPSG','9003','EPSG','1038','Ellipsoid scaling factor',1.0000382,'EPSG','9201',0); INSERT INTO "usage" VALUES('EPSG','9644','conversion','EPSG','6199','EPSG','1725','EPSG','1142'); -INSERT INTO "conversion" VALUES('EPSG','6203','Macedonia Gauss-Kruger','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); -INSERT INTO "usage" VALUES('EPSG','9645','conversion','EPSG','6203','EPSG','1148','EPSG','1142'); +INSERT INTO "conversion" VALUES('EPSG','6203','Macedonia Gauss-Kruger','A version of this projection with FN reduced by 4000000 is sometimes used for cadastre - see projection code 9911.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17410','conversion','EPSG','6203','EPSG','1148','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','6212','Arauca urban grid','','EPSG','1052','Colombia Urban','EPSG','8801','Latitude of natural origin',7.051538301,'EPSG','9110','EPSG','8802','Longitude of natural origin',-70.452991476,'EPSG','9110','EPSG','8806','False easting',1035263.443,'EPSG','9001','EPSG','8807','False northing',1275526.621,'EPSG','9001','EPSG','1039','Projection plane origin height',100.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','9650','conversion','EPSG','6212','EPSG','4122','EPSG','1055'); INSERT INTO "conversion" VALUES('EPSG','6213','Armenia urban grid','','EPSG','1052','Colombia Urban','EPSG','8801','Latitude of natural origin',4.315637,'EPSG','9110','EPSG','8802','Longitude of natural origin',-75.4024561,'EPSG','9110','EPSG','8806','False easting',1155824.666,'EPSG','9001','EPSG','8807','False northing',993087.465,'EPSG','9001','EPSG','1039','Projection plane origin height',1470.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); @@ -1536,9 +1536,9 @@ INSERT INTO "usage" VALUES('EPSG','10410','conversion','EPSG','8063','EPSG','4450','EPSG','1207'); INSERT INTO "conversion" VALUES('EPSG','8064','Pima County zone 4 Mt. Lemmon (ft)','Grid unit is International feet (note: not US Survey feet).','EPSG','9801','Lambert Conic Conformal (1SP)','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-110.45,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9998,'EPSG','9201','EPSG','8806','False easting',30000.0,'EPSG','9002','EPSG','8807','False northing',-620000.0,'EPSG','9002',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','10411','conversion','EPSG','8064','EPSG','4473','EPSG','1207'); -INSERT INTO "conversion" VALUES('EPSG','8080','MTM Nova Scotia zone 4 v2','Introduced for use with NAD83(CSRS)v6.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-61.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',24500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','8080','MTM Nova Scotia 2010 zone 4','Introduced for use with NAD83(CSRS)v6.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-61.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',24500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','10423','conversion','EPSG','8080','EPSG','1534','EPSG','1142'); -INSERT INTO "conversion" VALUES('EPSG','8081','MTM Nova Scotia zone 5 v2','Geomatics Centre, Nova Scotia Ministry of Housing and Municipal Affairs.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-64.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',25500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','8081','MTM Nova Scotia 2010 zone 5','Introduced for use with NAD83(CSRS)v6.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-64.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',25500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','10424','conversion','EPSG','8081','EPSG','1535','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','8087','Iceland Lambert 2016','Replaces Iceland Lambert 2004 (code 5326). Used only with ISN2016 geogCRS.','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',65.0,'EPSG','9110','EPSG','8822','Longitude of false origin',-19.0,'EPSG','9110','EPSG','8823','Latitude of 1st standard parallel',64.15,'EPSG','9110','EPSG','8824','Latitude of 2nd standard parallel',65.45,'EPSG','9110','EPSG','8826','Easting at false origin',2700000.0,'EPSG','9001','EPSG','8827','Northing at false origin',300000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','10425','conversion','EPSG','8087','EPSG','1120','EPSG','1241'); @@ -1810,8 +1810,22 @@ INSERT INTO "usage" VALUES('EPSG','16956','conversion','EPSG','9879','EPSG','4655','EPSG','1141'); INSERT INTO "conversion" VALUES('EPSG','9894','Luxembourg TM (3D)','','EPSG','1111','Transverse Mercator 3D','EPSG','8801','Latitude of natural origin',49.5,'EPSG','9110','EPSG','8802','Longitude of natural origin',6.1,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',80000.0,'EPSG','9001','EPSG','8807','False northing',100000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','17109','conversion','EPSG','9894','EPSG','1146','EPSG','1142'); +INSERT INTO "conversion" VALUES('EPSG','9911','Macedonia Gauss-Kruger truncated','Truncated version of Macedonia Gauss-Kruger, with 4000000m removed from northings.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9001','EPSG','8807','False northing',-4000000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17400','conversion','EPSG','9911','EPSG','1148','EPSG','1028'); INSERT INTO "conversion" VALUES('EPSG','9942','EBBWV14-TM','In conjunction with transformation ETRS89 to EBBWV14-IRF (1) (code 9941), emulates the EBBWV14 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',51.45,'EPSG','9110','EPSG','8802','Longitude of natural origin',-3.06,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',106702.326,'EPSG','9001','EPSG','8807','False northing',119968.1395,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','17347','conversion','EPSG','9942','EPSG','4661','EPSG','1141'); +INSERT INTO "conversion" VALUES('EPSG','9946','Iceland Lambert Azimuthal Equal Area','','EPSG','9820','Lambert Azimuthal Equal Area','EPSG','8801','Latitude of natural origin',65.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',-19.0,'EPSG','9102','EPSG','8806','False easting',1700000.0,'EPSG','9001','EPSG','8807','False northing',1300000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17463','conversion','EPSG','9946','EPSG','1120','EPSG','1162'); +INSERT INTO "conversion" VALUES('EPSG','9966','HULLEE13-TM','In conjunction with transformation ETRS89 to HULLEE13-IRF (1) (code 9965), emulates the HULLEE13 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',53.45,'EPSG','9110','EPSG','8802','Longitude of natural origin',-0.57,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',140859.7394,'EPSG','9001','EPSG','8807','False northing',247512.2812,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17427','conversion','EPSG','9966','EPSG','4663','EPSG','1141'); +INSERT INTO "conversion" VALUES('EPSG','9971','SCM22-TM','In conjunction with transformation ETRS89 to SCM22-IRF (1) (code 9970), emulates the SCM22 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',56.36,'EPSG','9110','EPSG','8802','Longitude of natural origin',-3.51,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',108600.972,'EPSG','9001','EPSG','8807','False northing',239087.349,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17440','conversion','EPSG','9971','EPSG','4665','EPSG','1141'); +INSERT INTO "conversion" VALUES('EPSG','9976','FNL22-TM','In conjunction with transformation ETRS89 to FNL22-IRF (1) (code 9975), emulates the FNL22 Snake projection.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',58.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-3.48,'EPSG','9110','EPSG','8805','Scale factor at natural origin',1.0,'EPSG','9201','EPSG','8806','False easting',139618.9493,'EPSG','9001','EPSG','8807','False northing',183110.794,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17455','conversion','EPSG','9976','EPSG','4664','EPSG','1141'); +INSERT INTO "conversion" VALUES('EPSG','9981','MTM Nova Scotia 1997 zone 4','Introduced for use with NAD83(CSRS)v3.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-61.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',14500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17527','conversion','EPSG','9981','EPSG','1534','EPSG','1142'); +INSERT INTO "conversion" VALUES('EPSG','9982','MTM Nova Scotia 1997 zone 5','Introduced for use with NAD83(CSRS)v3.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-64.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',15500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17525','conversion','EPSG','9982','EPSG','1535','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','10101','Alabama CS27 East zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-85.5,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.99996,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','11101','conversion','EPSG','10101','EPSG','2154','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','10102','Alabama CS27 West zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',30.0,'EPSG','9110','EPSG','8802','Longitude of natural origin',-87.3,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.999933333,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); @@ -2303,6 +2317,8 @@ INSERT INTO "usage" VALUES('EPSG','11344','conversion','EPSG','14903','EPSG','2272','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','14904','Wyoming CS27 West zone','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',40.4,'EPSG','9110','EPSG','8802','Longitude of natural origin',-110.05,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.999941177,'EPSG','9201','EPSG','8806','False easting',500000.0,'EPSG','9003','EPSG','8807','False northing',0.0,'EPSG','9003',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','11345','conversion','EPSG','14904','EPSG','2271','EPSG','1142'); +INSERT INTO "conversion" VALUES('EPSG','14930','Wyoming Lambert','Source originally defining the projection is unclear - possibly the Wyoming GIS Center.','EPSG','9802','Lambert Conic Conformal (2SP)','EPSG','8821','Latitude of false origin',41.0,'EPSG','9110','EPSG','8822','Longitude of false origin',-107.3,'EPSG','9110','EPSG','8823','Latitude of 1st standard parallel',41.0,'EPSG','9110','EPSG','8824','Latitude of 2nd standard parallel',45.0,'EPSG','9110','EPSG','8826','Easting at false origin',500000.0,'EPSG','9001','EPSG','8827','Northing at false origin',200000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17408','conversion','EPSG','14930','EPSG','1419','EPSG','1135'); INSERT INTO "conversion" VALUES('EPSG','14931','SPCS83 Wyoming East zone (meters)','See code 14935 for equivalent non-metric definition.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',40.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-105.1,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999375,'EPSG','9201','EPSG','8806','False easting',200000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','11346','conversion','EPSG','14931','EPSG','2269','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','14932','SPCS83 Wyoming East Central zone (meters)','See code 14936 for equivalent non-metric definition.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',40.3,'EPSG','9110','EPSG','8802','Longitude of natural origin',-107.2,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9999375,'EPSG','9201','EPSG','8806','False easting',400000.0,'EPSG','9001','EPSG','8807','False northing',100000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); @@ -4740,8 +4756,9 @@ INSERT INTO "usage" VALUES('EPSG','12859','conversion','EPSG','18275','EPSG','1709','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','18276','Balkans zone 6','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',18.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',6500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12860','conversion','EPSG','18276','EPSG','1710','EPSG','1142'); -INSERT INTO "conversion" VALUES('EPSG','18277','Balkans zone 7','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',7500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); +INSERT INTO "conversion" VALUES('EPSG','18277','Balkans zone 7','In Macedonia replaced by MSCS (map projection code 6203) from 2008 but from 2013 this projection used for AREC electronic cadastral database (E-kat) across whole country.','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',21.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',7500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12861','conversion','EPSG','18277','EPSG','1711','EPSG','1142'); +INSERT INTO "usage" VALUES('EPSG','17355','conversion','EPSG','18277','EPSG','1148','EPSG','1028'); INSERT INTO "conversion" VALUES('EPSG','18278','Balkans zone 8','','EPSG','9807','Transverse Mercator','EPSG','8801','Latitude of natural origin',0.0,'EPSG','9102','EPSG','8802','Longitude of natural origin',24.0,'EPSG','9102','EPSG','8805','Scale factor at natural origin',0.9999,'EPSG','9201','EPSG','8806','False easting',8500000.0,'EPSG','9001','EPSG','8807','False northing',0.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','12862','conversion','EPSG','18278','EPSG','1712','EPSG','1142'); INSERT INTO "conversion" VALUES('EPSG','18280','Poland zone I','','EPSG','9809','Oblique Stereographic','EPSG','8801','Latitude of natural origin',50.373,'EPSG','9110','EPSG','8802','Longitude of natural origin',21.05,'EPSG','9110','EPSG','8805','Scale factor at natural origin',0.9998,'EPSG','9201','EPSG','8806','False easting',4637000.0,'EPSG','9001','EPSG','8807','False northing',5467000.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); diff -Nru proj-9.0.0/data/sql/customizations.sql proj-9.0.1/data/sql/customizations.sql --- proj-9.0.0/data/sql/customizations.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/customizations.sql 2022-04-29 18:18:53.000000000 +0000 @@ -33,6 +33,19 @@ 'EPSG','1024' -- unknown ); +-- Defined in http://www.opengis.net/def/crs/OGC/0/CRS84h . Same as EPSG:4979 except axis order +INSERT INTO "geodetic_crs" VALUES('OGC','CRS84h','WGS 84 longitude-latitude-height',NULL,'geographic 3D','EPSG','6426','EPSG','6326',NULL,0); +INSERT INTO "scope" VALUES('PROJ','OGC_CRS84h','3D system frequently used in GIS, Web APIs and Web applications',0); +INSERT INTO "usage" VALUES( + 'PROJ', + 'OGC_CRS84h_USAGE', + 'geodetic_crs', + 'OGC', + 'CRS84h', + 'EPSG','1262', -- extent ('World') + 'PROJ','OGC_CRS84h' -- scope +); + INSERT INTO "geodetic_crs" VALUES('OGC','CRS27','NAD27 (CRS27)',NULL,'geographic 2D','EPSG','6424','EPSG','6267',NULL,0); INSERT INTO "usage" VALUES( 'PROJ', diff -Nru proj-9.0.0/data/sql/extent.sql proj-9.0.1/data/sql/extent.sql --- proj-9.0.0/data/sql/extent.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/extent.sql 2022-06-07 18:31:42.000000000 +0000 @@ -326,7 +326,7 @@ INSERT INTO "extent" VALUES('EPSG','1347','Belgium - onshore','Belgium - onshore.',49.5,51.51,2.5,6.4,0); INSERT INTO "extent" VALUES('EPSG','1348','South America - PSAD56 by country','Aruba - onshore; Bolivia; Bonaire - onshore; Brazil - offshore - Amazon Cone shelf; Chile - onshore north of 43°30''S; Curacao - onshore; Ecuador - mainland onshore; Guyana - onshore; Peru - onshore; Venezuela - onshore.',-43.5,12.68,-81.41,-47.99,0); INSERT INTO "extent" VALUES('EPSG','1349','North America - NAD27','North and central America: Antigua and Barbuda - onshore. Bahamas - onshore plus offshore over internal continental shelf only. Belize - onshore. British Virgin Islands - onshore. Canada onshore - Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan and Yukon - plus offshore east coast. Cuba - onshore and offshore. El Salvador - onshore. Guatemala - onshore. Honduras - onshore. Panama - onshore. Puerto Rico - onshore. Mexico - onshore plus offshore east coast. Nicaragua - onshore. United States (USA) onshore and offshore - Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin and Wyoming - plus offshore . US Virgin Islands - onshore.',7.15,83.17,167.65,-47.74,0); -INSERT INTO "extent" VALUES('EPSG','1350','North America - NAD83','North America - onshore and offshore: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Puerto Rico. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands. British Virgin Islands.',14.92,86.46,167.65,-47.74,0); +INSERT INTO "extent" VALUES('EPSG','1350','North America - NAD83','North America - onshore and offshore: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland and Labrador; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Puerto Rico. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. US Virgin Islands. British Virgin Islands.',14.92,86.45,167.65,-40.73,0); INSERT INTO "extent" VALUES('EPSG','1351','Asia - Middle East - Qatar offshore and UAE','Arabian Gulf; Qatar - offshore; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain - onshore and offshore.',22.63,27.05,50.55,57.13,0); INSERT INTO "extent" VALUES('EPSG','1352','Norway - onshore','Norway - onshore.',57.93,71.21,4.68,31.22,0); INSERT INTO "extent" VALUES('EPSG','1353','France - onshore','France - onshore.',NULL,NULL,NULL,NULL,1); @@ -687,7 +687,7 @@ INSERT INTO "extent" VALUES('EPSG','1708','Austria - east of 14°50''E','Austria east of 14°50''E of Greenwich (32°30''E of Ferro).',46.56,49.02,14.83,17.17,0); INSERT INTO "extent" VALUES('EPSG','1709','Europe - former Yugoslavia onshore west of 16.5°E','Bosnia and Herzegovina - west of 16°30''E; Croatia - onshore west of 16°30''E; Slovenia - onshore.',42.95,46.88,13.38,16.5,0); INSERT INTO "extent" VALUES('EPSG','1710','Europe - former Yugoslavia onshore 16.5°E to 19.5°E','Bosnia and Herzegovina - between 16°30''E and 19°30''E; Croatia - onshore east of 16°30''E; Montenegro - onshore west of 19°30''E; Serbia - west of 19°30''E.',41.79,46.55,16.5,19.51,0); -INSERT INTO "extent" VALUES('EPSG','1711','Europe - former Yugoslavia onshore 19.5°E to 22.5°E','Bosnia and Herzegovina - east of 19°30''E; Kosovo; Montenegro - east of 19°30''E; North Macedonia - west of 22°30''E; Serbia - between 19°30''E and 22°30''E.',40.85,46.19,19.5,22.51,0); +INSERT INTO "extent" VALUES('EPSG','1711','Europe - former Yugoslavia onshore 19.5°E to 22.5°E','Bosnia and Herzegovina - east of 19°30''E; Kosovo; Montenegro - east of 19°30''E; Serbia - between 19°30''E and 22°30''E.',41.85,46.18,19.5,22.5,0); INSERT INTO "extent" VALUES('EPSG','1712','Europe - former Yugoslavia onshore east of 22.5°E','North Macedonia - east of 22°30''E; Serbia - east of 22°30''E.',41.11,44.7,22.5,23.04,0); INSERT INTO "extent" VALUES('EPSG','1713','Nigeria - east of 10.5°E','Nigeria east of 10°30''E.',6.43,13.72,10.49,14.65,0); INSERT INTO "extent" VALUES('EPSG','1714','Nigeria - 6.5°E to 10.5°E','Nigeria between 6°30''E and 10°30''E, onshore and offshore shelf.',3.57,13.53,6.5,10.51,0); @@ -1827,9 +1827,9 @@ INSERT INTO "extent" VALUES('EPSG','2848','Sweden - 0 gon','Sweden - communes between approximately 16°55''E and 19°10''E; Gotland. See information source for map.',56.86,68.54,16.08,20.22,0); INSERT INTO "extent" VALUES('EPSG','2849','Sweden - 2.5 gon E','Sweden - communes between approximately 19°10''E and 21°25''E. See information source for map.',63.37,69.07,18.4,22.2,0); INSERT INTO "extent" VALUES('EPSG','2850','Sweden - 5 gon E','Sweden - east of approximately 21°26''E. See information source for map.',65.24,68.58,21.34,24.17,0); -INSERT INTO "extent" VALUES('EPSG','2851','Iceland - onshore west of 24°W','Iceland - onshore west of 24°W.',64.71,65.86,-24.66,-24.0,0); -INSERT INTO "extent" VALUES('EPSG','2852','Iceland - onshore 24°W to 18°W','Iceland - onshore between 24°W and 18°W.',63.34,66.52,-24.0,-18.0,0); -INSERT INTO "extent" VALUES('EPSG','2853','Iceland - onshore east of 18°W','Iceland - onshore east of 18°W.',63.45,66.59,-18.0,-13.38,0); +INSERT INTO "extent" VALUES('EPSG','2851','Iceland - mainland west of 24°W','Iceland - mainland west of 24°W.',64.71,65.85,-24.66,-24.0,0); +INSERT INTO "extent" VALUES('EPSG','2852','Iceland - mainland 24°W to 18°W','Iceland - mainland between 24°W and 18°W.',63.34,66.52,-24.0,-18.0,0); +INSERT INTO "extent" VALUES('EPSG','2853','Iceland - mainland east of 18°W','Iceland - mainland east of 18°W.',63.45,66.58,-18.0,-13.38,0); INSERT INTO "extent" VALUES('EPSG','2854','Europe - 36°W to 30°W','Europe - between 36°W and 30°W.',39.3,39.85,-36.0,-30.0,1); INSERT INTO "extent" VALUES('EPSG','2855','Europe - 30°W to 24°W','Europe - between 30°W and 24°W.',25.1,65.8,-30.0,-24.0,1); INSERT INTO "extent" VALUES('EPSG','2856','Europe - 24°W to 18°W','Europe - between 24°W and 18°W.',27.6,66.5,-24.0,-18.0,1); @@ -2238,7 +2238,7 @@ INSERT INTO "extent" VALUES('EPSG','3259','Guyana - onshore','Guyana - onshore.',1.18,8.58,-61.39,-56.47,0); INSERT INTO "extent" VALUES('EPSG','3260','Haiti - onshore','Haiti - onshore.',17.97,20.15,-74.52,-71.62,0); INSERT INTO "extent" VALUES('EPSG','3261','Honduras - onshore','Honduras - onshore.',12.98,16.49,-89.36,-83.08,0); -INSERT INTO "extent" VALUES('EPSG','3262','Iceland - onshore','Iceland - onshore.',63.34,66.59,-24.66,-13.38,0); +INSERT INTO "extent" VALUES('EPSG','3262','Iceland - mainland','Iceland - mainland.',63.34,66.59,-24.66,-13.38,0); INSERT INTO "extent" VALUES('EPSG','3263','Japan - onshore mainland','Japan - onshore mainland - Hokkaido, Honshu, Shikoku, Kyushu.',30.94,45.54,129.3,145.87,0); INSERT INTO "extent" VALUES('EPSG','3264','Kenya - onshore','Kenya - onshore.',-4.72,4.63,33.9,41.91,0); INSERT INTO "extent" VALUES('EPSG','3265','Korea, Democratic People''s Republic of (North Korea) - onshore','Democratic People''s Republic of Korea (North Korea) - onshore.',37.62,43.01,124.27,130.75,0); @@ -3635,5 +3635,9 @@ INSERT INTO "extent" VALUES('EPSG','4657','St Martin','St Martin - onshore and offshore.',17.87,18.19,-63.66,-62.73,0); INSERT INTO "extent" VALUES('EPSG','4658','St Barthelemy','St Barthélemy - onshore and offshore.',17.64,18.31,-63.1,-62.21,0); INSERT INTO "extent" VALUES('EPSG','4659','Italy - mainland west of 16°E','Italy - mainland northwest of approximately 16°E, including San Marino and Vatican City State.',39.65,47.09,6.62,16.52,0); -INSERT INTO "extent" VALUES('EPSG','4660','Germany - Hesse','Germany - Hesse.',49.39,51.66,7.77,10.24,0); +INSERT INTO "extent" VALUES('EPSG','4660','Germany - Hessen','Germany - Hessen.',49.39,51.66,7.77,10.24,0); INSERT INTO "extent" VALUES('EPSG','4661','UK - Newport to Ebbw Vale','United Kingdom (UK) - on or related to the rail route from Newport (Park Junction) to Ebbw Vale.',51.5,51.85,-3.3,-2.89,0); +INSERT INTO "extent" VALUES('EPSG','4662','Iceland - onshore','Iceland - onshore.',63.24,66.62,-24.66,-13.38,0); +INSERT INTO "extent" VALUES('EPSG','4663','UK - Leeds to Hull','United Kingdom (UK) - on or related to the rail route from the Morley tunnel through Leeds to Hull.',53.6,53.9,-1.7,0.27,0); +INSERT INTO "extent" VALUES('EPSG','4664','UK - Inverness to Thurso','United Kingdom (UK) - on or related to the rail route from Inverness to Thurso and Wick.',57.4,58.64,-4.6,-3.0,0); +INSERT INTO "extent" VALUES('EPSG','4665','UK - Motherwell to Inverness','United Kingdom (UK) - on or related to the Scottish central mainline rail route from Motherwell through Perth and Pitlochry to Inverness.',55.7,57.55,-4.4,-3.3,0); diff -Nru proj-9.0.0/data/sql/geodetic_crs.sql proj-9.0.1/data/sql/geodetic_crs.sql --- proj-9.0.0/data/sql/geodetic_crs.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/geodetic_crs.sql 2022-06-07 18:31:42.000000000 +0000 @@ -2168,3 +2168,15 @@ INSERT INTO "usage" VALUES('EPSG','17309','geodetic_crs','EPSG','9893','EPSG','1146','EPSG','1027'); INSERT INTO "geodetic_crs" VALUES('EPSG','9939','EBBWV14-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1319',NULL,0); INSERT INTO "usage" VALUES('EPSG','17353','geodetic_crs','EPSG','9939','EPSG','4661','EPSG','1141'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9964','HULLEE13-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1317',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17424','geodetic_crs','EPSG','9964','EPSG','4663','EPSG','1141'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9969','SCM22-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1320',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17438','geodetic_crs','EPSG','9969','EPSG','4665','EPSG','1141'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9974','FNL22-IRF',NULL,'geographic 2D','EPSG','6422','EPSG','1321',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17451','geodetic_crs','EPSG','9974','EPSG','4664','EPSG','1141'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9988','ITRF2020',NULL,'geocentric','EPSG','6500','EPSG','1322',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17904','geodetic_crs','EPSG','9988','EPSG','2830','EPSG','1027'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9989','ITRF2020',NULL,'geographic 3D','EPSG','6423','EPSG','1322',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17902','geodetic_crs','EPSG','9989','EPSG','1262','EPSG','1027'); +INSERT INTO "geodetic_crs" VALUES('EPSG','9990','ITRF2020',NULL,'geographic 2D','EPSG','6422','EPSG','1322',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17901','geodetic_crs','EPSG','9990','EPSG','1262','EPSG','1027'); diff -Nru proj-9.0.0/data/sql/geodetic_datum.sql proj-9.0.1/data/sql/geodetic_datum.sql --- proj-9.0.0/data/sql/geodetic_datum.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/geodetic_datum.sql 2022-06-07 18:31:42.000000000 +0000 @@ -346,8 +346,16 @@ INSERT INTO "usage" VALUES('EPSG','16933','geodetic_datum','EPSG','1314','EPSG','4652','EPSG','1141'); INSERT INTO "geodetic_datum" VALUES('EPSG','1315','MOLDOR11 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2021-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','16950','geodetic_datum','EPSG','1315','EPSG','4655','EPSG','1141'); -INSERT INTO "geodetic_datum" VALUES('EPSG','1319','EBBWV14 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2021-01-01',NULL,NULL,NULL,0); +INSERT INTO "geodetic_datum" VALUES('EPSG','1317','HULLEE13 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2022-01-01',NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17416','geodetic_datum','EPSG','1317','EPSG','4663','EPSG','1141'); +INSERT INTO "geodetic_datum" VALUES('EPSG','1319','EBBWV14 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2022-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','17343','geodetic_datum','EPSG','1319','EPSG','4661','EPSG','1141'); +INSERT INTO "geodetic_datum" VALUES('EPSG','1320','SCM22 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2022-01-01',NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17437','geodetic_datum','EPSG','1320','EPSG','4665','EPSG','1141'); +INSERT INTO "geodetic_datum" VALUES('EPSG','1321','FNL22 Intermediate Reference Frame',NULL,'EPSG','7019','EPSG','8901','2022-01-01',NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17450','geodetic_datum','EPSG','1321','EPSG','4664','EPSG','1141'); +INSERT INTO "geodetic_datum" VALUES('EPSG','1322','International Terrestrial Reference Frame 2020',NULL,'EPSG','7019','EPSG','8901','2015-01-01',2015.0,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17903','geodetic_datum','EPSG','1322','EPSG','1262','EPSG','1027'); INSERT INTO "geodetic_datum" VALUES('EPSG','6001','Not specified (based on Airy 1830 ellipsoid)',NULL,'EPSG','7001','EPSG','8901',NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13422','geodetic_datum','EPSG','6001','EPSG','1263','EPSG','1213'); INSERT INTO "geodetic_datum" VALUES('EPSG','6002','Not specified (based on Airy Modified 1849 ellipsoid)',NULL,'EPSG','7002','EPSG','8901',NULL,NULL,NULL,NULL,0); @@ -738,7 +746,7 @@ INSERT INTO "usage" VALUES('EPSG','13616','geodetic_datum','EPSG','6275','EPSG','3694','EPSG','1153'); INSERT INTO "geodetic_datum" VALUES('EPSG','6276','NSWC 9Z-2',NULL,'EPSG','7025','EPSG','8901','1976-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13617','geodetic_datum','EPSG','6276','EPSG','1262','EPSG','1245'); -INSERT INTO "geodetic_datum" VALUES('EPSG','6277','Ordnance Survey of Great Britain 1936',NULL,'EPSG','7001','EPSG','8901','1936',NULL,NULL,NULL,0); +INSERT INTO "geodetic_datum" VALUES('EPSG','6277','Ordnance Survey of Great Britain 1936',NULL,'EPSG','7001','EPSG','8901','1936-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13618','geodetic_datum','EPSG','6277','EPSG','4390','EPSG','1153'); INSERT INTO "geodetic_datum" VALUES('EPSG','6278','OSGB 1970 (SN)',NULL,'EPSG','7001','EPSG','8901','1970-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13619','geodetic_datum','EPSG','6278','EPSG','1264','EPSG','1027'); diff -Nru proj-9.0.0/data/sql/grid_alternatives.sql proj-9.0.1/data/sql/grid_alternatives.sql --- proj-9.0.0/data/sql/grid_alternatives.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/grid_alternatives.sql 2022-04-29 18:18:53.000000000 +0000 @@ -169,9 +169,9 @@ ('GGSPM06v1.mnt','fr_ign_ggspm06v1.tif','ggspm06v1.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/fr_ign_ggspm06v1.tif',1,1,NULL), -- is_lmi - National Land Survey of Iceland -('Icegeoid_ISN2004.gtx','is_lmi_Icegeoid_ISN2004.tif','Icegeoid_ISN2004.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/is_lmi_Icegeoid_ISN2004.tif',1,1,NULL), -('Icegeoid_ISN93.gtx','is_lmi_Icegeoid_ISN93.tif','Icegeoid_ISN93.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/is_lmi_Icegeoid_ISN93.tif',1,1,NULL), -('Icegeoid_ISN2016.gtx','is_lmi_Icegeoid_ISN2016.tif','Icegeoid_ISN2016.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/is_lmi_Icegeoid_ISN2016.tif',1,1,NULL), +('Icegeoid_ISN2004.gri','is_lmi_Icegeoid_ISN2004.tif','Icegeoid_ISN2004.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/is_lmi_Icegeoid_ISN2004.tif',1,1,NULL), +('Icegeoid_ISN93.gri','is_lmi_Icegeoid_ISN93.tif','Icegeoid_ISN93.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/is_lmi_Icegeoid_ISN93.tif',1,1,NULL), +('Icegeoid_ISN2016.gri','is_lmi_Icegeoid_ISN2016.tif','Icegeoid_ISN2016.gtx','GTiff','geoid_like',0,NULL,'https://cdn.proj.org/is_lmi_Icegeoid_ISN2016.tif',1,1,NULL), ('ISN93_ISN2016.gsb','is_lmi_ISN93_ISN2016.tif','ISN93_ISN2016.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/is_lmi_ISN93_ISN2016.tif',1,1,NULL), ('ISN2004_ISN2016.gsb','is_lmi_ISN2004_ISN2016.tif','ISN2004_ISN2016.gsb','GTiff','hgridshift',0,NULL,'https://cdn.proj.org/is_lmi_ISN2004_ISN2016.tif',1,1,NULL), diff -Nru proj-9.0.0/data/sql/grid_transformation_custom.sql proj-9.0.1/data/sql/grid_transformation_custom.sql --- proj-9.0.0/data/sql/grid_transformation_custom.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/grid_transformation_custom.sql 2022-04-29 18:18:53.000000000 +0000 @@ -86,68 +86,6 @@ 'EPSG','1024' -- unknown ); --- Iceland - -INSERT INTO "grid_transformation" VALUES( - 'PROJ','EPSG_5323_TO_EPSG_8089','ISN2004 to ISH2004 height', - NULL, - 'EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)', - 'EPSG','5323', -- source CRS (ISN2004 geographic 3D) - 'EPSG','8089', -- target CRS (ISH2004 height) - NULL, - 'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN2004.gtx', - NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); - -INSERT INTO "usage" VALUES( - 'PROJ', - 'EPSG_5323_TO_EPSG_8089_USAGE', - 'grid_transformation', - 'PROJ', - 'EPSG_5323_TO_EPSG_8089', - 'EPSG','1120', -- area of use: Iceland - onshore and offshore - 'EPSG','1024' -- unknown -); - -INSERT INTO "grid_transformation" VALUES( - 'PROJ','EPSG_4945_TO_EPSG_8089','ISN93 to ISH2004 height', - NULL, - 'EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)', - 'EPSG','4945', -- source CRS (ISN93 geographic 3D) - 'EPSG','8089', -- target CRS (ISH2004 height) - NULL, - 'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN93.gtx', - NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); - -INSERT INTO "usage" VALUES( - 'PROJ', - 'EPSG_4945_TO_EPSG_8089_USAGE', - 'grid_transformation', - 'PROJ', - 'EPSG_4945_TO_EPSG_8089', - 'EPSG','1120', -- area of use: Iceland - onshore and offshore - 'EPSG','1024' -- unknown -); - -INSERT INTO "grid_transformation" VALUES( - 'PROJ','EPSG_8085_TO_EPSG_8089','ISN2016 to ISH2004 height', - NULL, - 'EPSG','9665','Geographic3D to GravityRelatedHeight (gtx)', - 'EPSG','8085', -- source CRS (ISN2016 geographic 3D) - 'EPSG','8089', -- target CRS (ISH2004 height) - NULL, - 'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN2016.gtx', - NULL,NULL,NULL,NULL,NULL,NULL,NULL,0); - -INSERT INTO "usage" VALUES( - 'PROJ', - 'EPSG_8085_TO_EPSG_8089_USAGE', - 'grid_transformation', - 'PROJ', - 'EPSG_8085_TO_EPSG_8089', - 'EPSG','1120', -- area of use: Iceland - onshore and offshore - 'EPSG','1024' -- unknown -); - -- Japan INSERT INTO "grid_transformation" VALUES( diff -Nru proj-9.0.0/data/sql/grid_transformation.sql proj-9.0.1/data/sql/grid_transformation.sql --- proj-9.0.0/data/sql/grid_transformation.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/grid_transformation.sql 2022-06-07 18:31:42.000000000 +0000 @@ -372,8 +372,8 @@ INSERT INTO "usage" VALUES('EPSG','9489','grid_transformation','EPSG','5657','EPSG','2947','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','5661','ED50 to ETRS89 (14)','When included in concatenation from and to projected CRSs, gives same results as ED50 / UTM zone 31N to ETRS89 / UTM zone 31N (1) - see CRS code 5166.','EPSG','9615','NTv2','EPSG','4230','EPSG','4258',0.05,'EPSG','8656','Latitude and longitude difference file','100800401.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'ICC-Esp Cat',0); INSERT INTO "usage" VALUES('EPSG','9492','grid_transformation','EPSG','5661','EPSG','3732','EPSG','1079'); -INSERT INTO "grid_transformation" VALUES('EPSG','5891','MGI to ETRS89 (5)','Not to be used for cadastral purposes as it does not comply with the rules for control network tie-in as per Paragraph 3 of the Land Survey Regulations (Vermessungsverordnung) 2010.','EPSG','9615','NTv2','EPSG','4312','EPSG','4258',0.15,'EPSG','8656','Latitude and longitude difference file','AT_GIS_GRID.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut NTv2',0); -INSERT INTO "usage" VALUES('EPSG','14324','grid_transformation','EPSG','5891','EPSG','1037','EPSG','1078'); +INSERT INTO "grid_transformation" VALUES('EPSG','5891','MGI to ETRS89 (5)','Not to be used for cadastral purposes because it does not comply with the rules for control network tie-in as per Paragraph 3 of the Land Survey Regulations (Vermessungsverordnung) 2010. Replaced by GIS-Grid 2021 (MGI to ETRS89 (8), code 9910).','EPSG','9615','NTv2','EPSG','4312','EPSG','4258',0.15,'EPSG','8656','Latitude and longitude difference file','AT_GIS_GRID.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut NTv2',0); +INSERT INTO "usage" VALUES('EPSG','17397','grid_transformation','EPSG','5891','EPSG','1037','EPSG','1144'); INSERT INTO "grid_transformation" VALUES('EPSG','6138','CIGD11 to GCVD54 height (ft) (1)','Care: source CRS heights are in metres, transformation file parameter values and target CRS heights are in feet. For reversible alternative to this transformation see CIGD11 to CIGD11 + GCVD54 height (ft)) (code 9603).','EPSG','1050','Geographic3D to GravityRelatedHeight (CI)','EPSG','6134','EPSG','6130',0.03,'EPSG','8666','Geoid (height correction) model file','GCGM0811.TXT',NULL,NULL,NULL,NULL,NULL,NULL,'LSD-Cym',0); INSERT INTO "usage" VALUES('EPSG','14268','grid_transformation','EPSG','6138','EPSG','3185','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','6139','CIGD11 to LCVD61 height (ft) (1)','Care: source CRS heights are in metres, transformation file parameter values and target CRS heights are in feet. For reversible alternative to this transformation see CIGD11 to CIGD11 + LCVD61 height (ft) (1) (code 9604).','EPSG','1050','Geographic3D to GravityRelatedHeight (CI)','EPSG','6134','EPSG','6131',0.03,'EPSG','8666','Geoid (height correction) model file','LCGM0811.TXT',NULL,NULL,NULL,NULL,NULL,NULL,'LSD-Cym',0); @@ -1150,6 +1150,8 @@ INSERT INTO "usage" VALUES('EPSG','17367','grid_transformation','EPSG','9908','EPSG','1347','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','9909','ETRS89 to ETRS89 + Ostend height (1)','Reversible alternative to ETRS89 to Ostend height (1) (code 9908). In use from 2018-08-01.','EPSG','1098','Geog3D to Geog2D+GravityRelatedHeight (txt)','EPSG','4937','EPSG','9907',0.02,'EPSG','8666','Geoid (height correction) model file','hBG18.dat',NULL,NULL,NULL,NULL,'EPSG','4258','NGI-Bel 2018',0); INSERT INTO "usage" VALUES('EPSG','17373','grid_transformation','EPSG','9909','EPSG','1347','EPSG','1270'); +INSERT INTO "grid_transformation" VALUES('EPSG','9910','MGI to ETRS89 (8)','Replaces GIS-Grid (2010) (CT 5891). Not to be used for cadastral purposes because it does not comply with the rules for control network tie-in as per Paragraph 3 of the Land Survey Regulations (Vermessungsverordnung) 2010.','EPSG','9615','NTv2','EPSG','4312','EPSG','4258',0.14,'EPSG','8656','Latitude and longitude difference file','AT_GIS_GRID_2021_09_28.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BEV-Aut NTv2 2021',0); +INSERT INTO "usage" VALUES('EPSG','17414','grid_transformation','EPSG','9910','EPSG','1037','EPSG','1144'); INSERT INTO "grid_transformation" VALUES('EPSG','9914','ETRS89 to BI height (1)','For reversible alternative to this transformation see ETRS89 to ETRS89 + BI height (1) (code 9915).','EPSG','9663','Geographic3D to GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','9451',0.02,'EPSG','8666','Geoid (height correction) model file','OSTN15_OSGM15_GB.txt',NULL,NULL,NULL,NULL,NULL,NULL,'OS-Gbr 2015',0); INSERT INTO "usage" VALUES('EPSG','17330','grid_transformation','EPSG','9914','EPSG','4390','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','9915','ETRS89 to ETRS89 + BI height (1)','Reversible alternative to ETRS89 to BI height (1) (code 9914).','EPSG','1097','Geog3D to Geog2D+GravityRelatedHeight (OSGM-GB)','EPSG','4937','EPSG','9452',0.02,'EPSG','8666','Geoid (height correction) model file','OSTN15_OSGM15_GB.txt',NULL,NULL,NULL,NULL,'EPSG','4258','OS-Gbr 2015',0); @@ -1168,10 +1170,32 @@ INSERT INTO "usage" VALUES('EPSG','17171','grid_transformation','EPSG','9925','EPSG','3339','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','9926','ETRS89 to ETRS89 + DHHN2016 height (1)','Reversible alternative to ETRS89 to DHHN2016 height (1) (code 9925). Accuracy approx. 1 cm in the lowlands, approx. 2 cm in the high mountains and 2 - 6 cm offshore.','EPSG','1098','Geog3D to Geog2D+GravityRelatedHeight (txt)','EPSG','4937','EPSG','9924',0.02,'EPSG','8666','Geoid (height correction) model file','GCG2016.txt',NULL,NULL,NULL,NULL,'EPSG','4258','BKG-Deu 2016',0); INSERT INTO "usage" VALUES('EPSG','17170','grid_transformation','EPSG','9926','EPSG','3339','EPSG','1270'); -INSERT INTO "grid_transformation" VALUES('EPSG','9940','DHDN to ETRS89 (11)','Official transformation of Hesse for the land survey register (ALKIS).','EPSG','9615','NTv2','EPSG','4314','EPSG','4258',0.1,'EPSG','8656','Latitude and longitude difference file','HeTa2010.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'LVGL-Deu HE 2010',0); +INSERT INTO "grid_transformation" VALUES('EPSG','9940','DHDN to ETRS89 (11)','Official transformation of Hessen for the land survey register (ALKIS).','EPSG','9615','NTv2','EPSG','4314','EPSG','4258',0.1,'EPSG','8656','Latitude and longitude difference file','HeTa2010.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'LVGL-Deu HE 2010',0); INSERT INTO "usage" VALUES('EPSG','17340','grid_transformation','EPSG','9940','EPSG','4660','EPSG','1055'); INSERT INTO "grid_transformation" VALUES('EPSG','9941','ETRS89 to EBBWV14-IRF (1)','In conjunction with EBBWV14-TM map projection (code 9942) applied to EBBWV14-IRF (code 9939), emulates the EBBWV14 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009) defines EBBWV14-IRF hence is errorless. ','EPSG','9615','NTv2','EPSG','4258','EPSG','9939',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-EBBWV14-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr EBBWV14 OSNet2009',0); INSERT INTO "usage" VALUES('EPSG','17356','grid_transformation','EPSG','9941','EPSG','4661','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9954','ISN93 to ISH2004 height (1)','File is also available in NOAA VDatum format (Icegeoid_ISN93.gtx). For reversible alternative to this transformation see ISN93 to ISN93 + ISH2004 height (1) (CT code 9955). Replaced by Icegeoid_ISN2004 (CT code 9956).','EPSG','1047','Geographic3D to GravityRelatedHeight (Gravsoft)','EPSG','4945','EPSG','8089',0.05,'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN93.gri',NULL,NULL,NULL,NULL,NULL,NULL,'NMI-Isl',0); +INSERT INTO "usage" VALUES('EPSG','17385','grid_transformation','EPSG','9954','EPSG','4662','EPSG','1133'); +INSERT INTO "grid_transformation" VALUES('EPSG','9955','ISN93 to ISN93 + ISH2004 height (1)','Reversible alternative to ISN93 to ISH2004 height (1) (code 9954). File is also available in NOAA VDatum format (Icegeoid_ISN93.gtx). Replaced by Icegeoid_ISN2004.','EPSG','1093','Geog3D to Geog2D+GravityRelatedHeight (Gravsoft)','EPSG','4945','EPSG','9948',0.05,'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN93.gri',NULL,NULL,NULL,NULL,'EPSG','4659','NMI-Isl',0); +INSERT INTO "usage" VALUES('EPSG','17393','grid_transformation','EPSG','9955','EPSG','4662','EPSG','1270'); +INSERT INTO "grid_transformation" VALUES('EPSG','9956','ISN2004 to ISH2004 height (1)','File also available in NOAA VDatum format (Icegeoid_ISN2004.gtx). For reversible alternative to this transformation see ISN2004 to ISN2004 + ISH2004 height (1) (CT code 9957). Replaces Icegeoid_ISN93 (code 9954). Replaced by Icegeoid_ISN2016 (code 9958).','EPSG','1047','Geographic3D to GravityRelatedHeight (Gravsoft)','EPSG','5323','EPSG','8089',0.05,'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN2004.gri',NULL,NULL,NULL,NULL,NULL,NULL,'NMI-Isl',0); +INSERT INTO "usage" VALUES('EPSG','17391','grid_transformation','EPSG','9956','EPSG','4662','EPSG','1133'); +INSERT INTO "grid_transformation" VALUES('EPSG','9957','ISN2004 to ISN2004 + ISH2004 height (1)','Reversible alternative to ISN2004 to ISH2004 height (1) (CT code 9956). File is also available in NOAA VDatum format (Icegeoid_ISN2004.gtx). Replaces Icegeoid_ISN93, replaced by Icegeoid_ISN2016.','EPSG','1093','Geog3D to Geog2D+GravityRelatedHeight (Gravsoft)','EPSG','5323','EPSG','9949',0.05,'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN2004.gri',NULL,NULL,NULL,NULL,'EPSG','5324','NMI-Isl',0); +INSERT INTO "usage" VALUES('EPSG','17394','grid_transformation','EPSG','9957','EPSG','4662','EPSG','1270'); +INSERT INTO "grid_transformation" VALUES('EPSG','9958','ISN2016 to ISH2004 height (1)','File also available in NOAA VDatum format (Icegeoid_ISN2016.gtx). For reversible alternative to this transformation see ISN2016 to ISN2016 + ISH2004 height (1) (CT code 9959). Replaces Icegeoid_ISN2004 (code 9956).','EPSG','1047','Geographic3D to GravityRelatedHeight (Gravsoft)','EPSG','8085','EPSG','8089',0.05,'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN2016.gri',NULL,NULL,NULL,NULL,NULL,NULL,'NMI-Isl',0); +INSERT INTO "usage" VALUES('EPSG','17392','grid_transformation','EPSG','9958','EPSG','4662','EPSG','1133'); +INSERT INTO "grid_transformation" VALUES('EPSG','9959','ISN2016 to ISN2016 + ISH2004 height (1)','Reversible alternative to ISN2016 to ISH2004 height (1) (CT code 9958). File is also available in NOAA VDatum format (Icegeoid_ISN2016.gtx). Replaces Icegeoid_ISN2004.','EPSG','1093','Geog3D to Geog2D+GravityRelatedHeight (Gravsoft)','EPSG','8085','EPSG','9950',0.05,'EPSG','8666','Geoid (height correction) model file','Icegeoid_ISN2016.gri',NULL,NULL,NULL,NULL,'EPSG','8086','NMI-Isl',0); +INSERT INTO "usage" VALUES('EPSG','17395','grid_transformation','EPSG','9959','EPSG','4662','EPSG','1270'); +INSERT INTO "grid_transformation" VALUES('EPSG','9965','ETRS89 to HULLEE13-IRF (1)','In conjunction with the HULLEE13-TM map projection (code 9966) applied to HULLEE13-IRF (code 9964), emulates the HULLEE13 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009) defines HULLEE13-IRF hence is errorless. ','EPSG','9615','NTv2','EPSG','4258','EPSG','9964',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-HULLEE13-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr HULLEE OSNet2009',0); +INSERT INTO "usage" VALUES('EPSG','17458','grid_transformation','EPSG','9965','EPSG','4663','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9970','ETRS89 to SCM22-IRF (1)','In conjunction with the SCM22-TM map projection (code 9971) applied to SCM22-IRF (code 9969), emulates the SCM22 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009) defines SCM22-IRF hence is errorless. ','EPSG','9615','NTv2','EPSG','4258','EPSG','9969',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-SCM22-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr SCM22 OSNet2009',0); +INSERT INTO "usage" VALUES('EPSG','17453','grid_transformation','EPSG','9970','EPSG','4665','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9975','ETRS89 to FNL22-IRF (1)','In conjunction with the FNL22-TM map projection (code 9976) applied to FNL22-IRF (code 9974), emulates the FNL22 Snake projection. Applied to ETRS89 (as realized through the OSNet v2009) defines FNL22-IRF hence is errorless. ','EPSG','9615','NTv2','EPSG','4258','EPSG','9974',0.0,'EPSG','8656','Latitude and longitude difference file','TN15-ETRS89-to-FNL22-IRF.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'NR-Gbr FNL22 OSNet2009',0); +INSERT INTO "usage" VALUES('EPSG','17452','grid_transformation','EPSG','9975','EPSG','4664','EPSG','1141'); +INSERT INTO "grid_transformation" VALUES('EPSG','9979','SIRGAS 1995 to SIRGAS 2000 (1)','Derived at 48 stations.','EPSG','9615','NTv2','EPSG','4170','EPSG','4674',0.006,'EPSG','8656','Latitude and longitude difference file','SIRGAS1995-to-SIRGAS2000.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SIR-SAm 2021',0); +INSERT INTO "usage" VALUES('EPSG','17507','grid_transformation','EPSG','9979','EPSG','3448','EPSG','1278'); +INSERT INTO "grid_transformation" VALUES('EPSG','9980','SIRGAS 2000 to SIRGAS-CON SIR17P01 (1)','Derived at 79 stations at epoch 2015.00. Accuracy deteriorates with time due to intra-plate seismic deformation.','EPSG','9615','NTv2','EPSG','4674','EPSG','8987',0.02,'EPSG','8656','Latitude and longitude difference file','SIRGAS2000-to-SIRGAS-CONSIR17P01.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'SIR-SAm 2021',0); +INSERT INTO "usage" VALUES('EPSG','17505','grid_transformation','EPSG','9980','EPSG','4530','EPSG','1255'); INSERT INTO "grid_transformation" VALUES('EPSG','10000','RGF93 v1 to NGF-IGN69 height (1)','May be used for transformations from WGS 84 to NGF-IGN69 height. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4965','EPSG','5720',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0); INSERT INTO "usage" VALUES('EPSG','11001','grid_transformation','EPSG','10000','EPSG','1326','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','10001','ETRS89 to NGF-IGN69 height (1)','Parameter values taken from RGF93 v1 to NGF-IGN69 height (1) (code 10000) assuming that RGF93 v1 is equivalent to ETRS89 within the accuracy of the transformation. Accuracy at each 0.1 deg x 0.1 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4937','EPSG','5720',0.5,'EPSG','8666','Geoid (height correction) model file','ggf97a.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Fra',0); @@ -1342,6 +1366,10 @@ INSERT INTO "usage" VALUES('EPSG','11084','grid_transformation','EPSG','10083','EPSG','2947','EPSG','1133'); INSERT INTO "grid_transformation" VALUES('EPSG','10084','WGS 84 to EGM96 height (1)','Replaces WGS 84 to EGM84 height (1) (CT 15781). Replaced by WGS 84 to EGM2008 height (1) and (2) (CTs 3858-59). For reversible alternative see WGS 84 to WGS 84 + EGM96 height (1) (CT 9708). An executable using spherical harmonics is also available.','EPSG','9661','Geographic3D to GravityRelatedHeight (EGM)','EPSG','4979','EPSG','5773',1.0,'EPSG','8666','Geoid (height correction) model file','WW15MGH.GRD',NULL,NULL,NULL,NULL,NULL,NULL,'NGA-World',0); INSERT INTO "usage" VALUES('EPSG','11085','grid_transformation','EPSG','10084','EPSG','1262','EPSG','1133'); +INSERT INTO "grid_transformation" VALUES('EPSG','10106','ETRS89 to SVD2006 height (1)','For reversible alternative see ETRS89 to ETRS89 + SVD2006 height (1) (code 10107).','EPSG','1047','Geographic3D to GravityRelatedHeight (Gravsoft)','EPSG','4937','EPSG','20000',1.0,'EPSG','8666','Geoid (height correction) model file','arcgp-2006-sk.bin',NULL,NULL,NULL,NULL,NULL,NULL,'NMA-Sjm SV 2006',0); +INSERT INTO "usage" VALUES('EPSG','17961','grid_transformation','EPSG','10106','EPSG','4058','EPSG','1133'); +INSERT INTO "grid_transformation" VALUES('EPSG','10107','ETRS89 to ETRS89 + SVD2006 height (1)','Reversible alternative to ETRS89 to SVD2006 height (1) (code 10106).','EPSG','1093','Geog3D to Geog2D+GravityRelatedHeight (Gravsoft)','EPSG','4937','EPSG','20001',1.0,'EPSG','8666','Geoid (height correction) model file','arcgp-2006-sk.bin',NULL,NULL,NULL,NULL,'EPSG','4258','NMA-Sjm SV 2006',0); +INSERT INTO "usage" VALUES('EPSG','17960','grid_transformation','EPSG','10107','EPSG','4058','EPSG','1270'); INSERT INTO "grid_transformation" VALUES('EPSG','15486','CH1903 to CH1903+ (1)','For improved accuracy (0.01m) use CHENyx06 interpolation programme FINELTRA. File CHENyx06 replaced by CHENyx06a; there is a small area at the border of the data where some more real data has been introduced. swisstopo consider the change insignificant.','EPSG','9615','NTv2','EPSG','4149','EPSG','4150',0.2,'EPSG','8656','Latitude and longitude difference file','CHENyx06a.gsb',NULL,NULL,NULL,NULL,NULL,NULL,'BfL-Che',0); INSERT INTO "usage" VALUES('EPSG','11497','grid_transformation','EPSG','15486','EPSG','1286','EPSG','1085'); INSERT INTO "grid_transformation" VALUES('EPSG','15488','RRAF 1991 to IGN 1988 MG height (1)','May be used for transformations from WGS 84 to IGN 1988 MG. Accuracy at each 0.025 deg x 0.025 degree grid node is given within the geoid model file.','EPSG','9664','Geographic3D to GravityRelatedHeight (IGN1997)','EPSG','4973','EPSG','5617',0.2,'EPSG','8666','Geoid (height correction) model file','ggg00_mg.txt',NULL,NULL,NULL,NULL,NULL,NULL,'IGN Glp MG',1); diff -Nru proj-9.0.0/data/sql/helmert_transformation.sql proj-9.0.1/data/sql/helmert_transformation.sql --- proj-9.0.0/data/sql/helmert_transformation.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/helmert_transformation.sql 2022-06-07 18:31:42.000000000 +0000 @@ -2481,6 +2481,32 @@ INSERT INTO "usage" VALUES('EPSG','17307','helmert_transformation','EPSG','9937','EPSG','1146','EPSG','1283'); INSERT INTO "helmert_transformation" VALUES('EPSG','9938','LUREF to ETRS89 (8)','LUREF 2020 parameters. For an equivalent CT using the Molodensky-Badekas method see CT 9937. Defines LUREF from 2020. Replaces LUREF 2014 parameters (CT 9899). Info source gives CT in reverse direction. Derived using ETRF2000 @2013-01-27.','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4181','EPSG','4258',0.0,-189.228,12.0035,-42.6303,'EPSG','9001',0.48171,3.09948,-2.68639,'EPSG','9104',0.46346,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'ACT-Lux CF 2020',0); INSERT INTO "usage" VALUES('EPSG','17308','helmert_transformation','EPSG','9938','EPSG','1146','EPSG','1283'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9960','WGS 84 (Transit) to WGS 84 (G730) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Derived through ITRF90 and ITRF91 at epoch 1990.5. Parameter values valid at other epochs including 2005.0.','EPSG','1032','Coordinate Frame rotation (geocentric domain)','EPSG','7815','EPSG','7656',0.7,-58.0,521.0,239.0,'EPSG','1025',18.3,-0.3,7.0,'EPSG','1031',10.7,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'KD2022-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17491','helmert_transformation','EPSG','9960','EPSG','1262','EPSG','1026'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9961','WGS 84 (G730) to WGS 84 (G873) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Derived via ITRF91 through ITRF94 at epoch 1995.5. Parameter values valid at other epochs including 2005.0.','EPSG','1032','Coordinate Frame rotation (geocentric domain)','EPSG','7656','EPSG','7658',0.04,-20.0,-16.0,14.0,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',-0.69,'EPSG','1028',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'KD2022-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17492','helmert_transformation','EPSG','9961','EPSG','1262','EPSG','1026'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9962','WGS 84 (G873) to WGS 84 (G1150) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Derived via ITRF94 through ITRF2000. May be approximated to 0.2m using 7-parameter CF method 1032 with parameters for epoch 1999.50 of tX=1.1mm tY=-8.0mm tZ=14.3mm rX=0 rY=0 rZ=0.05mas dS=1.505ppb.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','7658','EPSG','7660',0.03,1.1,-4.7,22.0,'EPSG','1025',0.0,0.0,0.16,'EPSG','1031',1.45,'EPSG','1028',0.0,0.6,1.4,'EPSG','1027',0.0,0.0,0.02,'EPSG','1032',-0.01,'EPSG','1030',2005.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'KD2022-Wld',0); +INSERT INTO "usage" VALUES('EPSG','18078','helmert_transformation','EPSG','9962','EPSG','1262','EPSG','1026'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9963','WGS 84 (G1150) to WGS 84 (G1674) (1)','Scale difference in ppb where 1/billion = 1E-9 or nm/m. Derived via ITRF2005. May be approximated to 0.4m using 7-parameter CF method 1032 with parameters for epoch 2007.50 of tX=-2.65mm tY=1.35mm tZ=27.7mm rX=-0.27mas rY=027mas rZ=-0.38 mas dS=1.88ppb.','EPSG','1056','Time-dependent Coordinate Frame rotation (geocen)','EPSG','7660','EPSG','7662',0.02,-2.4,1.6,23.2,'EPSG','1025',-0.27,0.27,-0.38,'EPSG','1031',2.08,'EPSG','1028',-0.1,-0.1,1.8,'EPSG','1027',0.0,0.0,0.0,'EPSG','1032',-0.08,'EPSG','1030',2005.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'KD2022-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17500','helmert_transformation','EPSG','9963','EPSG','1262','EPSG','1026'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9991','ITRF2014 to ITRF2020 (1)','IERS describes CT in opposite direction. Estimated using core network of 131 stations at 105 sites. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','7789','EPSG','9988',0.001,1.4,0.9,-1.4,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.42,'EPSG','1028',0.0,0.1,-0.2,'EPSG','1027',0.0,0.0,0.0,'EPSG','1032',0.0,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17933','helmert_transformation','EPSG','9991','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9992','ITRF2008 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from those already published between ITRF2020, ITRF2014 and ITRF2008. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9 or nm/m.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','5332','EPSG','9988',0.01,-0.2,-1.0,-3.3,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',0.29,'EPSG','1028',0.0,0.1,-0.1,'EPSG','1027',0.0,0.0,0.0,'EPSG','1032',-0.03,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17946','helmert_transformation','EPSG','9992','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9993','ITRF2005 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4896','EPSG','9988',0.01,-2.7,-0.1,1.4,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',-0.65,'EPSG','1028',-0.3,0.1,-0.1,'EPSG','1027',0.0,0.0,0.0,'EPSG','1032',-0.03,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17935','helmert_transformation','EPSG','9993','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9994','ITRF2000 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4919','EPSG','9988',0.01,0.2,-0.8,34.2,'EPSG','1025',0.0,0.0,0.0,'EPSG','1031',-2.25,'EPSG','1028',-0.1,0.0,1.7,'EPSG','1027',0.0,0.0,0.0,'EPSG','1032',-0.11,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17936','helmert_transformation','EPSG','9994','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9995','ITRF97 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4918','EPSG','9988',0.01,-6.5,3.9,77.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-3.98,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17937','helmert_transformation','EPSG','9995','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9996','ITRF96 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4917','EPSG','9988',0.01,-6.5,3.9,77.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-3.98,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17938','helmert_transformation','EPSG','9996','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9997','ITRF94 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4916','EPSG','9988',0.01,-6.5,3.9,77.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-3.98,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17939','helmert_transformation','EPSG','9997','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9998','ITRF93 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4915','EPSG','9988',0.01,65.8,-1.9,71.3,'EPSG','1025',3.36,4.33,-0.75,'EPSG','1031',-4.47,'EPSG','1028',2.8,0.2,2.3,'EPSG','1027',0.11,0.19,-0.07,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17947','helmert_transformation','EPSG','9998','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','9999','ITRF92 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4914','EPSG','9988',0.01,-14.5,1.9,85.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-3.27,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17941','helmert_transformation','EPSG','9999','EPSG','1262','EPSG','1027'); INSERT INTO "helmert_transformation" VALUES('EPSG','10085','Trinidad 1903 to WGS 84 (2)','Parameter values provided to EOG by Trinidad Ministry of Energy and Energy Industries. Used by EOG offshore Trinidad (including Pelican, Kiskadee and Ibis fields) since 1996.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4302','EPSG','4326',3.0,-61.0,285.2,471.6,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EOG-Tto Trin',0); INSERT INTO "usage" VALUES('EPSG','11086','helmert_transformation','EPSG','10085','EPSG','1339','EPSG','1136'); INSERT INTO "helmert_transformation" VALUES('EPSG','10086','JAD69 to WGS 72 (1)','Derived in 1977 through Transit observations at 2 stations by US DMA.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4242','EPSG','4322',15.0,48.0,208.0,382.0,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'SD-Jam',0); @@ -2501,6 +2527,14 @@ INSERT INTO "usage" VALUES('EPSG','11099','helmert_transformation','EPSG','10098','EPSG','3333','EPSG','1035'); INSERT INTO "helmert_transformation" VALUES('EPSG','10099','KKJ to WGS 84 (2)','Parameter values from KKJ to ETRS89 (2) (code 10098). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation. Replaces KKJ to WGS 84 (1) (code 1639).','EPSG','9607','Coordinate Frame rotation (geog2D domain)','EPSG','4123','EPSG','4326',1.0,-96.062,-82.428,-121.753,'EPSG','9001',-4.801,-0.345,1.376,'EPSG','9104',1.496,'EPSG','9202',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'EPSG-Fin JHS153',0); INSERT INTO "usage" VALUES('EPSG','11100','helmert_transformation','EPSG','10099','EPSG','3333','EPSG','1151'); +INSERT INTO "helmert_transformation" VALUES('EPSG','10100','ITRF91 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4913','EPSG','9988',0.01,-26.5,-12.1,91.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-4.67,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17942','helmert_transformation','EPSG','10100','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','10103','ITRF90 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4912','EPSG','9988',0.01,-24.5,-8.1,107.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-4.97,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17943','helmert_transformation','EPSG','10103','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','10104','ITRF89 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4911','EPSG','9988',0.01,-29.5,-32.1,145.9,'EPSG','1025',0.0,0.0,-0.36,'EPSG','1031',-8.37,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17944','helmert_transformation','EPSG','10104','EPSG','1262','EPSG','1027'); +INSERT INTO "helmert_transformation" VALUES('EPSG','10105','ITRF88 to ITRF2020 (1)','IERS describes CT in opposite direction. Parameter values derived from the those between ITRF2020, ITRF2014 and ITRF2008 and those published between earlier realizations. Scale difference in ppb and scale difference rate in ppb/yr where 1/billion = 1E-9.','EPSG','1053','Time-dependent Position Vector tfm (geocentric)','EPSG','4910','EPSG','9988',0.01,-24.5,3.9,169.9,'EPSG','1025',-0.1,0.0,-0.36,'EPSG','1031',-11.47,'EPSG','1028',-0.1,0.6,3.1,'EPSG','1027',0.0,0.0,-0.02,'EPSG','1032',-0.12,'EPSG','1030',2015.0,'EPSG','1029',NULL,NULL,NULL,NULL,NULL,'IERS-Wld',0); +INSERT INTO "usage" VALUES('EPSG','17948','helmert_transformation','EPSG','10105','EPSG','1262','EPSG','1027'); INSERT INTO "helmert_transformation" VALUES('EPSG','15483','Tokyo to JGD2000 (1)','Derived at Tokyo datum origin. Accuracy on main islands 9m. Also used on remote islands with significantly less accuracy: Io-To 793m, Kitadaito and Minamidaito Jima 642m, Tarama and Minna Shima 560m, Ishigaki and Taketomi Jima 251m, Yonaguni Jima 248m.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4301','EPSG','4612',9.0,-146.414,507.337,680.507,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'GSI-Jpn',0); INSERT INTO "usage" VALUES('EPSG','11494','helmert_transformation','EPSG','15483','EPSG','3957','EPSG','1142'); INSERT INTO "helmert_transformation" VALUES('EPSG','15484','Tokyo to WGS 84 (108)','Parameter values from Tokyo to JGD2000 (1) (code 15483). Assumes JGD2000 and WGS 84 can be considered the same to within the accuracy of the transformation.','EPSG','9603','Geocentric translations (geog2D domain)','EPSG','4301','EPSG','4326',9.0,-146.414,507.337,680.507,'EPSG','9001',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'OGP-Jpn',0); diff -Nru proj-9.0.0/data/sql/metadata.sql proj-9.0.1/data/sql/metadata.sql --- proj-9.0.0/data/sql/metadata.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/metadata.sql 2022-06-07 19:29:47.000000000 +0000 @@ -9,8 +9,8 @@ INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MAJOR', 1); INSERT INTO "metadata" VALUES('DATABASE.LAYOUT.VERSION.MINOR', 2); -INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.054'); -INSERT INTO "metadata" VALUES('EPSG.DATE', '2022-02-13'); +INSERT INTO "metadata" VALUES('EPSG.VERSION', 'v10.064'); +INSERT INTO "metadata" VALUES('EPSG.DATE', '2022-05-19'); -- The value of ${PROJ_VERSION} is substituted at build time by the actual -- value. @@ -18,4 +18,4 @@ -- Version of the PROJ-data package with which this database is the most -- compatible. -INSERT INTO "metadata" VALUES('PROJ_DATA.VERSION', '1.9'); +INSERT INTO "metadata" VALUES('PROJ_DATA.VERSION', '1.10'); diff -Nru proj-9.0.0/data/sql/projected_crs.sql proj-9.0.1/data/sql/projected_crs.sql --- proj-9.0.0/data/sql/projected_crs.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/projected_crs.sql 2022-06-07 18:31:42.000000000 +0000 @@ -5051,6 +5051,7 @@ INSERT INTO "usage" VALUES('EPSG','4551','projected_crs','EPSG','6312','EPSG','3236','EPSG','1092'); INSERT INTO "projected_crs" VALUES('EPSG','6316','MGI 1901 / Balkans zone 7',NULL,'EPSG','4498','EPSG','3906','EPSG','18277',NULL,0); INSERT INTO "usage" VALUES('EPSG','4552','projected_crs','EPSG','6316','EPSG','1711','EPSG','1092'); +INSERT INTO "usage" VALUES('EPSG','17354','projected_crs','EPSG','6316','EPSG','1148','EPSG','1028'); INSERT INTO "projected_crs" VALUES('EPSG','6328','NAD83(2011) / UTM zone 59N',NULL,'EPSG','4400','EPSG','6318','EPSG','16059',NULL,0); INSERT INTO "usage" VALUES('EPSG','4562','projected_crs','EPSG','6328','EPSG','3372','EPSG','1211'); INSERT INTO "projected_crs" VALUES('EPSG','6329','NAD83(2011) / UTM zone 60N',NULL,'EPSG','4400','EPSG','6318','EPSG','16060',NULL,0); @@ -6713,9 +6714,9 @@ INSERT INTO "usage" VALUES('EPSG','5608','projected_crs','EPSG','8067','EPSG','4450','EPSG','1207'); INSERT INTO "projected_crs" VALUES('EPSG','8068','NAD83(2011) / PCCS zone 4 (ft)',NULL,'EPSG','4495','EPSG','6318','EPSG','8064',NULL,0); INSERT INTO "usage" VALUES('EPSG','5609','projected_crs','EPSG','8068','EPSG','4473','EPSG','1207'); -INSERT INTO "projected_crs" VALUES('EPSG','8082','NAD83(CSRS)v6 / MTM Nova Scotia zone 4',NULL,'EPSG','4400','EPSG','8252','EPSG','8080',NULL,0); +INSERT INTO "projected_crs" VALUES('EPSG','8082','NAD83(CSRS)v6 / MTM NS 2010 zone 4',NULL,'EPSG','4400','EPSG','8252','EPSG','8080',NULL,0); INSERT INTO "usage" VALUES('EPSG','5610','projected_crs','EPSG','8082','EPSG','1534','EPSG','1142'); -INSERT INTO "projected_crs" VALUES('EPSG','8083','NAD83(CSRS)v6 / MTM Nova Scotia zone 5',NULL,'EPSG','4400','EPSG','8252','EPSG','8081',NULL,0); +INSERT INTO "projected_crs" VALUES('EPSG','8083','NAD83(CSRS)v6 / MTM NS 2010 zone 5',NULL,'EPSG','4400','EPSG','8252','EPSG','8081',NULL,0); INSERT INTO "usage" VALUES('EPSG','5611','projected_crs','EPSG','8083','EPSG','1535','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','8088','ISN2016 / Lambert 2016',NULL,'EPSG','4499','EPSG','8086','EPSG','8087',NULL,0); INSERT INTO "usage" VALUES('EPSG','5615','projected_crs','EPSG','8088','EPSG','1120','EPSG','1210'); @@ -7437,6 +7438,16 @@ INSERT INTO "usage" VALUES('EPSG','17310','projected_crs','EPSG','9895','EPSG','1146','EPSG','1091'); INSERT INTO "projected_crs" VALUES('EPSG','9943','EBBWV14 Grid',NULL,'EPSG','4400','EPSG','9939','EPSG','9942',NULL,0); INSERT INTO "usage" VALUES('EPSG','17349','projected_crs','EPSG','9943','EPSG','4661','EPSG','1141'); +INSERT INTO "projected_crs" VALUES('EPSG','9945','Macedonia State Coordinate System truncated',NULL,'EPSG','4498','EPSG','3906','EPSG','9911',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17461','projected_crs','EPSG','9945','EPSG','1148','EPSG','1028'); +INSERT INTO "projected_crs" VALUES('EPSG','9947','ISN2004 / LAEA Iceland',NULL,'EPSG','4400','EPSG','5324','EPSG','9946',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17376','projected_crs','EPSG','9947','EPSG','1120','EPSG','1162'); +INSERT INTO "projected_crs" VALUES('EPSG','9967','HULLEE13 Grid',NULL,'EPSG','4400','EPSG','9964','EPSG','9966',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17429','projected_crs','EPSG','9967','EPSG','4663','EPSG','1141'); +INSERT INTO "projected_crs" VALUES('EPSG','9972','SCM22 Grid',NULL,'EPSG','4400','EPSG','9969','EPSG','9971',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17441','projected_crs','EPSG','9972','EPSG','4665','EPSG','1141'); +INSERT INTO "projected_crs" VALUES('EPSG','9977','FNL22 Grid',NULL,'EPSG','4400','EPSG','9974','EPSG','9976',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17456','projected_crs','EPSG','9977','EPSG','4664','EPSG','1141'); INSERT INTO "projected_crs" VALUES('EPSG','20004','Pulkovo 1995 / Gauss-Kruger zone 4',NULL,'EPSG','4530','EPSG','4200','EPSG','16204',NULL,0); INSERT INTO "usage" VALUES('EPSG','6177','projected_crs','EPSG','20004','EPSG','1763','EPSG','1211'); INSERT INTO "projected_crs" VALUES('EPSG','20005','Pulkovo 1995 / Gauss-Kruger zone 5',NULL,'EPSG','4530','EPSG','4200','EPSG','16205',NULL,0); @@ -8153,12 +8164,73 @@ INSERT INTO "usage" VALUES('EPSG','6359','projected_crs','EPSG','22196','EPSG','1613','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22197','Campo Inchauspe / Argentina 7',NULL,'EPSG','4530','EPSG','4221','EPSG','18037',NULL,0); INSERT INTO "usage" VALUES('EPSG','6360','projected_crs','EPSG','22197','EPSG','1614','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22207','NAD83(CSRS)v2 / UTM zone 7N',NULL,'EPSG','4400','EPSG','8237','EPSG','16007',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18003','projected_crs','EPSG','22207','EPSG','3409','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22208','NAD83(CSRS)v2 / UTM zone 8N',NULL,'EPSG','4400','EPSG','8237','EPSG','16008',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18004','projected_crs','EPSG','22208','EPSG','3410','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22209','NAD83(CSRS)v2 / UTM zone 9N',NULL,'EPSG','4400','EPSG','8237','EPSG','16009',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18005','projected_crs','EPSG','22209','EPSG','3411','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22210','NAD83(CSRS)v2 / UTM zone 10N',NULL,'EPSG','4400','EPSG','8237','EPSG','16010',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18006','projected_crs','EPSG','22210','EPSG','3412','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22211','NAD83(CSRS)v2 / UTM zone 11N',NULL,'EPSG','4400','EPSG','8237','EPSG','16011',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18007','projected_crs','EPSG','22211','EPSG','3528','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22212','NAD83(CSRS)v2 / UTM zone 12N',NULL,'EPSG','4400','EPSG','8237','EPSG','16012',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18008','projected_crs','EPSG','22212','EPSG','3527','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22213','NAD83(CSRS)v2 / UTM zone 13N',NULL,'EPSG','4400','EPSG','8237','EPSG','16013',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17996','projected_crs','EPSG','22213','EPSG','3526','EPSG','1142'); +INSERT INTO "usage" VALUES('EPSG','17997','projected_crs','EPSG','22213','EPSG','2375','EPSG','1220'); +INSERT INTO "projected_crs" VALUES('EPSG','22214','NAD83(CSRS)v2 / UTM zone 14N',NULL,'EPSG','4400','EPSG','8237','EPSG','16014',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17998','projected_crs','EPSG','22214','EPSG','3413','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22215','NAD83(CSRS)v2 / UTM zone 15N',NULL,'EPSG','4400','EPSG','8237','EPSG','16015',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17999','projected_crs','EPSG','22215','EPSG','3414','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22216','NAD83(CSRS)v2 / UTM zone 16N',NULL,'EPSG','4400','EPSG','8237','EPSG','16016',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18000','projected_crs','EPSG','22216','EPSG','3415','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22217','NAD83(CSRS)v2 / UTM zone 17N',NULL,'EPSG','4400','EPSG','8237','EPSG','16017',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18001','projected_crs','EPSG','22217','EPSG','3416','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22218','NAD83(CSRS)v2 / UTM zone 18N',NULL,'EPSG','4400','EPSG','8237','EPSG','16018',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18002','projected_crs','EPSG','22218','EPSG','3417','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22219','NAD83(CSRS)v2 / UTM zone 19N',NULL,'EPSG','4400','EPSG','8237','EPSG','16019',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17992','projected_crs','EPSG','22219','EPSG','3524','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22220','NAD83(CSRS)v2 / UTM zone 20N',NULL,'EPSG','4400','EPSG','8237','EPSG','16020',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17993','projected_crs','EPSG','22220','EPSG','3525','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22221','NAD83(CSRS)v2 / UTM zone 21N',NULL,'EPSG','4400','EPSG','8237','EPSG','16021',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17994','projected_crs','EPSG','22221','EPSG','2151','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22222','NAD83(CSRS)v2 / UTM zone 22N',NULL,'EPSG','4400','EPSG','8237','EPSG','16022',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17995','projected_crs','EPSG','22222','EPSG','2152','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22234','Cape / UTM zone 34S',NULL,'EPSG','4400','EPSG','4222','EPSG','16134',NULL,0); INSERT INTO "usage" VALUES('EPSG','6361','projected_crs','EPSG','22234','EPSG','1615','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22235','Cape / UTM zone 35S',NULL,'EPSG','4400','EPSG','4222','EPSG','16135',NULL,0); INSERT INTO "usage" VALUES('EPSG','6362','projected_crs','EPSG','22235','EPSG','1617','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22236','Cape / UTM zone 36S',NULL,'EPSG','4400','EPSG','4222','EPSG','16136',NULL,1); INSERT INTO "usage" VALUES('EPSG','6363','projected_crs','EPSG','22236','EPSG','1616','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22239','NAD83(CSRS)v2 / PEI Stereographic',NULL,'EPSG','4496','EPSG','8237','EPSG','19960',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18015','projected_crs','EPSG','22239','EPSG','1533','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22240','NAD83(CSRS)v2 / NB Stereographic',NULL,'EPSG','4500','EPSG','8237','EPSG','19946',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18016','projected_crs','EPSG','22240','EPSG','1447','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22243','NAD83(CSRS)v2 / SCoPQ zone 3',NULL,'EPSG','4499','EPSG','8237','EPSG','17703',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18017','projected_crs','EPSG','22243','EPSG','1446','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22244','NAD83(CSRS)v2 / SCoPQ zone 4',NULL,'EPSG','4499','EPSG','8237','EPSG','17704',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18018','projected_crs','EPSG','22244','EPSG','1422','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22245','NAD83(CSRS)v2 / SCoPQ zone 5',NULL,'EPSG','4499','EPSG','8237','EPSG','17705',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18019','projected_crs','EPSG','22245','EPSG','1423','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22246','NAD83(CSRS)v2 / SCoPQ zone 6',NULL,'EPSG','4499','EPSG','8237','EPSG','17706',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18020','projected_crs','EPSG','22246','EPSG','1424','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22247','NAD83(CSRS)v2 / SCoPQ zone 7',NULL,'EPSG','4499','EPSG','8237','EPSG','17707',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18021','projected_crs','EPSG','22247','EPSG','1425','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22248','NAD83(CSRS)v2 / SCoPQ zone 8',NULL,'EPSG','4499','EPSG','8237','EPSG','17708',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18074','projected_crs','EPSG','22248','EPSG','1426','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22249','NAD83(CSRS)v2 / SCoPQ zone 9',NULL,'EPSG','4499','EPSG','8237','EPSG','17709',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18076','projected_crs','EPSG','22249','EPSG','1427','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22250','NAD83(CSRS)v2 / SCoPQ zone 10',NULL,'EPSG','4499','EPSG','8237','EPSG','17710',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18077','projected_crs','EPSG','22250','EPSG','1428','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22262','NAD83(CSRS)v2 / Alberta 3TM ref merid 111 W',NULL,'EPSG','4400','EPSG','8237','EPSG','17722',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18009','projected_crs','EPSG','22262','EPSG','3543','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22263','NAD83(CSRS)v2 / Alberta 3TM ref merid 114 W',NULL,'EPSG','4400','EPSG','8237','EPSG','17723',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18010','projected_crs','EPSG','22263','EPSG','3542','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22264','NAD83(CSRS)v2 / Alberta 3TM ref merid 117 W',NULL,'EPSG','4400','EPSG','8237','EPSG','17724',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18011','projected_crs','EPSG','22264','EPSG','3541','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22265','NAD83(CSRS)v2 / Alberta 3TM ref merid 120 W',NULL,'EPSG','4400','EPSG','8237','EPSG','17726',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18012','projected_crs','EPSG','22265','EPSG','3540','EPSG','1096'); INSERT INTO "projected_crs" VALUES('EPSG','22275','Cape / Lo15',NULL,'EPSG','6503','EPSG','4222','EPSG','17515',NULL,0); INSERT INTO "usage" VALUES('EPSG','6364','projected_crs','EPSG','22275','EPSG','1454','EPSG','1092'); INSERT INTO "projected_crs" VALUES('EPSG','22277','Cape / Lo17',NULL,'EPSG','6503','EPSG','4222','EPSG','17517',NULL,0); @@ -8181,12 +8253,108 @@ INSERT INTO "usage" VALUES('EPSG','6373','projected_crs','EPSG','22293','EPSG','1463','EPSG','1092'); INSERT INTO "projected_crs" VALUES('EPSG','22300','Carthage (Paris) / Tunisia Mining Grid',NULL,'EPSG','4406','EPSG','4816','EPSG','19937',NULL,0); INSERT INTO "usage" VALUES('EPSG','6374','projected_crs','EPSG','22300','EPSG','1618','EPSG','1249'); +INSERT INTO "projected_crs" VALUES('EPSG','22307','NAD83(CSRS)v3 / UTM zone 7N',NULL,'EPSG','4400','EPSG','8240','EPSG','16007',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17752','projected_crs','EPSG','22307','EPSG','3409','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22308','NAD83(CSRS)v3 / UTM zone 8N',NULL,'EPSG','4400','EPSG','8240','EPSG','16008',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17834','projected_crs','EPSG','22308','EPSG','3410','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22309','NAD83(CSRS)v3 / UTM zone 9N',NULL,'EPSG','4400','EPSG','8240','EPSG','16009',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17771','projected_crs','EPSG','22309','EPSG','3411','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22310','NAD83(CSRS)v3 / UTM zone 10N',NULL,'EPSG','4400','EPSG','8240','EPSG','16010',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17839','projected_crs','EPSG','22310','EPSG','3412','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22311','NAD83(CSRS)v3 / UTM zone 11N',NULL,'EPSG','4400','EPSG','8240','EPSG','16011',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17777','projected_crs','EPSG','22311','EPSG','3528','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22312','NAD83(CSRS)v3 / UTM zone 12N',NULL,'EPSG','4400','EPSG','8240','EPSG','16012',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17783','projected_crs','EPSG','22312','EPSG','3527','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22313','NAD83(CSRS)v3 / UTM zone 13N',NULL,'EPSG','4400','EPSG','8240','EPSG','16013',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17789','projected_crs','EPSG','22313','EPSG','3526','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22314','NAD83(CSRS)v3 / UTM zone 14N',NULL,'EPSG','4400','EPSG','8240','EPSG','16014',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17795','projected_crs','EPSG','22314','EPSG','3413','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22315','NAD83(CSRS)v3 / UTM zone 15N',NULL,'EPSG','4400','EPSG','8240','EPSG','16015',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17801','projected_crs','EPSG','22315','EPSG','3414','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22316','NAD83(CSRS)v3 / UTM zone 16N',NULL,'EPSG','4400','EPSG','8240','EPSG','16016',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17829','projected_crs','EPSG','22316','EPSG','3415','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22317','NAD83(CSRS)v3 / UTM zone 17N',NULL,'EPSG','4400','EPSG','8240','EPSG','16017',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17816','projected_crs','EPSG','22317','EPSG','3416','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22318','NAD83(CSRS)v3 / UTM zone 18N',NULL,'EPSG','4400','EPSG','8240','EPSG','16018',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17822','projected_crs','EPSG','22318','EPSG','3417','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22319','NAD83(CSRS)v3 / UTM zone 19N',NULL,'EPSG','4400','EPSG','8240','EPSG','16019',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17844','projected_crs','EPSG','22319','EPSG','3524','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22320','NAD83(CSRS)v3 / UTM zone 20N',NULL,'EPSG','4400','EPSG','8240','EPSG','16020',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17850','projected_crs','EPSG','22320','EPSG','3525','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22321','NAD83(CSRS)v3 / UTM zone 21N',NULL,'EPSG','4400','EPSG','8240','EPSG','16021',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17857','projected_crs','EPSG','22321','EPSG','2151','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22322','NAD83(CSRS)v3 / UTM zone 22N',NULL,'EPSG','4400','EPSG','8240','EPSG','16022',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17863','projected_crs','EPSG','22322','EPSG','2152','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22332','Carthage / UTM zone 32N',NULL,'EPSG','4400','EPSG','4223','EPSG','16032',NULL,0); INSERT INTO "usage" VALUES('EPSG','6375','projected_crs','EPSG','22332','EPSG','1489','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22337','NAD83(CSRS)v3 / MTM NS 1997 zone 5',NULL,'EPSG','4400','EPSG','8240','EPSG','9982',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18013','projected_crs','EPSG','22337','EPSG','1535','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22338','NAD83(CSRS)v3 / MTM NS 1997 zone 4',NULL,'EPSG','4400','EPSG','8240','EPSG','9981',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18014','projected_crs','EPSG','22338','EPSG','1534','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22348','NAD83(CSRS)v3 / MTM zone 8',NULL,'EPSG','4496','EPSG','8240','EPSG','17708',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18071','projected_crs','EPSG','22348','EPSG','1429','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22349','NAD83(CSRS)v3 / MTM zone 9',NULL,'EPSG','4496','EPSG','8240','EPSG','17709',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18072','projected_crs','EPSG','22349','EPSG','1430','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22350','NAD83(CSRS)v3 / MTM zone 10',NULL,'EPSG','4496','EPSG','8240','EPSG','17710',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18073','projected_crs','EPSG','22350','EPSG','1431','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22351','NAD83(CSRS)v3 / MTM zone 11',NULL,'EPSG','4400','EPSG','8240','EPSG','17711',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17639','projected_crs','EPSG','22351','EPSG','1432','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22352','NAD83(CSRS)v3 / MTM zone 12',NULL,'EPSG','4400','EPSG','8240','EPSG','17712',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17640','projected_crs','EPSG','22352','EPSG','1433','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22353','NAD83(CSRS)v3 / MTM zone 13',NULL,'EPSG','4400','EPSG','8240','EPSG','17713',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17641','projected_crs','EPSG','22353','EPSG','1434','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22354','NAD83(CSRS)v3 / MTM zone 14',NULL,'EPSG','4400','EPSG','8240','EPSG','17714',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17642','projected_crs','EPSG','22354','EPSG','1435','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22355','NAD83(CSRS)v3 / MTM zone 15',NULL,'EPSG','4400','EPSG','8240','EPSG','17715',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17643','projected_crs','EPSG','22355','EPSG','1436','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22356','NAD83(CSRS)v3 / MTM zone 16',NULL,'EPSG','4400','EPSG','8240','EPSG','17716',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17644','projected_crs','EPSG','22356','EPSG','1437','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22357','NAD83(CSRS)v3 / MTM zone 17',NULL,'EPSG','4400','EPSG','8240','EPSG','17717',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17645','projected_crs','EPSG','22357','EPSG','1438','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22391','Carthage / Nord Tunisie',NULL,'EPSG','4499','EPSG','4223','EPSG','18181',NULL,0); INSERT INTO "usage" VALUES('EPSG','6376','projected_crs','EPSG','22391','EPSG','1619','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22392','Carthage / Sud Tunisie',NULL,'EPSG','4499','EPSG','4223','EPSG','18182',NULL,0); INSERT INTO "usage" VALUES('EPSG','6377','projected_crs','EPSG','22392','EPSG','1620','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22407','NAD83(CSRS)v4 / UTM zone 7N',NULL,'EPSG','4400','EPSG','8246','EPSG','16007',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17761','projected_crs','EPSG','22407','EPSG','3409','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22408','NAD83(CSRS)v4 / UTM zone 8N',NULL,'EPSG','4400','EPSG','8246','EPSG','16008',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17835','projected_crs','EPSG','22408','EPSG','3410','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22409','NAD83(CSRS)v4 / UTM zone 9N',NULL,'EPSG','4400','EPSG','8246','EPSG','16009',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17766','projected_crs','EPSG','22409','EPSG','3411','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22410','NAD83(CSRS)v4 / UTM zone 10N',NULL,'EPSG','4400','EPSG','8246','EPSG','16010',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17840','projected_crs','EPSG','22410','EPSG','3412','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22411','NAD83(CSRS)v4 / UTM zone 11N',NULL,'EPSG','4400','EPSG','8246','EPSG','16011',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17778','projected_crs','EPSG','22411','EPSG','3528','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22412','NAD83(CSRS)v4 / UTM zone 12N',NULL,'EPSG','4400','EPSG','8246','EPSG','16012',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17784','projected_crs','EPSG','22412','EPSG','3527','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22413','NAD83(CSRS)v4 / UTM zone 13N',NULL,'EPSG','4400','EPSG','8246','EPSG','16013',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17790','projected_crs','EPSG','22413','EPSG','3526','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22414','NAD83(CSRS)v4 / UTM zone 14N',NULL,'EPSG','4400','EPSG','8246','EPSG','16014',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17796','projected_crs','EPSG','22414','EPSG','3413','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22415','NAD83(CSRS)v4 / UTM zone 15N',NULL,'EPSG','4400','EPSG','8246','EPSG','16015',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17827','projected_crs','EPSG','22415','EPSG','3414','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22416','NAD83(CSRS)v4 / UTM zone 16N',NULL,'EPSG','4400','EPSG','8246','EPSG','16016',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17830','projected_crs','EPSG','22416','EPSG','3415','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22417','NAD83(CSRS)v4 / UTM zone 17N',NULL,'EPSG','4400','EPSG','8246','EPSG','16017',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17817','projected_crs','EPSG','22417','EPSG','3416','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22418','NAD83(CSRS)v4 / UTM zone 18N',NULL,'EPSG','4400','EPSG','8246','EPSG','16018',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17823','projected_crs','EPSG','22418','EPSG','3417','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22419','NAD83(CSRS)v4 / UTM zone 19N',NULL,'EPSG','4400','EPSG','8246','EPSG','16019',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17845','projected_crs','EPSG','22419','EPSG','3524','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22420','NAD83(CSRS)v4 / UTM zone 20N',NULL,'EPSG','4400','EPSG','8246','EPSG','16020',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17851','projected_crs','EPSG','22420','EPSG','3525','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22421','NAD83(CSRS)v4 / UTM zone 21N',NULL,'EPSG','4400','EPSG','8246','EPSG','16021',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17858','projected_crs','EPSG','22421','EPSG','2151','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22422','NAD83(CSRS)v4 / UTM zone 22N',NULL,'EPSG','4400','EPSG','8246','EPSG','16022',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17864','projected_crs','EPSG','22422','EPSG','2152','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22462','NAD83(CSRS)v4 / Alberta 3TM ref merid 111 W',NULL,'EPSG','4400','EPSG','8246','EPSG','17722',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17657','projected_crs','EPSG','22462','EPSG','3543','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22463','NAD83(CSRS)v4 / Alberta 3TM ref merid 114 W',NULL,'EPSG','4400','EPSG','8246','EPSG','17723',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17658','projected_crs','EPSG','22463','EPSG','3542','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22464','NAD83(CSRS)v4 / Alberta 3TM ref merid 117 W',NULL,'EPSG','4400','EPSG','8246','EPSG','17724',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17659','projected_crs','EPSG','22464','EPSG','3541','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22465','NAD83(CSRS)v4 / Alberta 3TM ref merid 120 W',NULL,'EPSG','4400','EPSG','8246','EPSG','17726',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17660','projected_crs','EPSG','22465','EPSG','3540','EPSG','1096'); INSERT INTO "projected_crs" VALUES('EPSG','22521','Corrego Alegre 1970-72 / UTM zone 21S',NULL,'EPSG','4400','EPSG','4225','EPSG','16121',NULL,0); INSERT INTO "usage" VALUES('EPSG','6378','projected_crs','EPSG','22521','EPSG','3355','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22522','Corrego Alegre 1970-72 / UTM zone 22S',NULL,'EPSG','4400','EPSG','4225','EPSG','16122',NULL,0); @@ -8197,8 +8365,116 @@ INSERT INTO "usage" VALUES('EPSG','6381','projected_crs','EPSG','22524','EPSG','1818','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22525','Corrego Alegre 1970-72 / UTM zone 25S',NULL,'EPSG','4400','EPSG','4225','EPSG','16125',NULL,0); INSERT INTO "usage" VALUES('EPSG','6382','projected_crs','EPSG','22525','EPSG','3178','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22607','NAD83(CSRS)v6 / UTM zone 7N',NULL,'EPSG','4400','EPSG','8252','EPSG','16007',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17755','projected_crs','EPSG','22607','EPSG','3409','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22608','NAD83(CSRS)v6 / UTM zone 8N',NULL,'EPSG','4400','EPSG','8252','EPSG','16008',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17836','projected_crs','EPSG','22608','EPSG','3410','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22609','NAD83(CSRS)v6 / UTM zone 9N',NULL,'EPSG','4400','EPSG','8252','EPSG','16009',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17768','projected_crs','EPSG','22609','EPSG','3411','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22610','NAD83(CSRS)v6 / UTM zone 10N',NULL,'EPSG','4400','EPSG','8252','EPSG','16010',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17841','projected_crs','EPSG','22610','EPSG','3412','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22611','NAD83(CSRS)v6 / UTM zone 11N',NULL,'EPSG','4400','EPSG','8252','EPSG','16011',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17779','projected_crs','EPSG','22611','EPSG','3528','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22612','NAD83(CSRS)v6 / UTM zone 12N',NULL,'EPSG','4400','EPSG','8252','EPSG','16012',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17786','projected_crs','EPSG','22612','EPSG','3527','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22613','NAD83(CSRS)v6 / UTM zone 13N',NULL,'EPSG','4400','EPSG','8252','EPSG','16013',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17791','projected_crs','EPSG','22613','EPSG','3526','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22614','NAD83(CSRS)v6 / UTM zone 14N',NULL,'EPSG','4400','EPSG','8252','EPSG','16014',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17797','projected_crs','EPSG','22614','EPSG','3413','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22615','NAD83(CSRS)v6 / UTM zone 15N',NULL,'EPSG','4400','EPSG','8252','EPSG','16015',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17803','projected_crs','EPSG','22615','EPSG','3414','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22616','NAD83(CSRS)v6 / UTM zone 16N',NULL,'EPSG','4400','EPSG','8252','EPSG','16016',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17831','projected_crs','EPSG','22616','EPSG','3415','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22617','NAD83(CSRS)v6 / UTM zone 17N',NULL,'EPSG','4400','EPSG','8252','EPSG','16017',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17818','projected_crs','EPSG','22617','EPSG','3416','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22618','NAD83(CSRS)v6 / UTM zone 18N',NULL,'EPSG','4400','EPSG','8252','EPSG','16018',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17824','projected_crs','EPSG','22618','EPSG','3417','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22619','NAD83(CSRS)v6 / UTM zone 19N',NULL,'EPSG','4400','EPSG','8252','EPSG','16019',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17846','projected_crs','EPSG','22619','EPSG','3524','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22620','NAD83(CSRS)v6 / UTM zone 20N',NULL,'EPSG','4400','EPSG','8252','EPSG','16020',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17852','projected_crs','EPSG','22620','EPSG','3525','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22621','NAD83(CSRS)v6 / UTM zone 21N',NULL,'EPSG','4400','EPSG','8252','EPSG','16021',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17859','projected_crs','EPSG','22621','EPSG','2151','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22622','NAD83(CSRS)v6 / UTM zone 22N',NULL,'EPSG','4400','EPSG','8252','EPSG','16022',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17865','projected_crs','EPSG','22622','EPSG','2152','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22639','NAD83(CSRS)v6 / PEI Stereographic',NULL,'EPSG','4496','EPSG','8252','EPSG','19960',NULL,0); +INSERT INTO "usage" VALUES('EPSG','18070','projected_crs','EPSG','22639','EPSG','1533','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22641','NAD83(CSRS)v6 / MTM zone 1',NULL,'EPSG','4496','EPSG','8252','EPSG','17701',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17665','projected_crs','EPSG','22641','EPSG','2226','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22642','NAD83(CSRS)v6 / MTM zone 2',NULL,'EPSG','4496','EPSG','8252','EPSG','17702',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17666','projected_crs','EPSG','22642','EPSG','2227','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22643','NAD83(CSRS)v6 / MTM zone 3',NULL,'EPSG','4496','EPSG','8252','EPSG','17703',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17667','projected_crs','EPSG','22643','EPSG','2275','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22644','NAD83(CSRS)v6 / MTM zone 4',NULL,'EPSG','4496','EPSG','8252','EPSG','17704',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17668','projected_crs','EPSG','22644','EPSG','3875','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22645','NAD83(CSRS)v6 / MTM zone 5',NULL,'EPSG','4496','EPSG','8252','EPSG','17705',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17669','projected_crs','EPSG','22645','EPSG','3865','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22646','NAD83(CSRS)v6 / MTM zone 6',NULL,'EPSG','4496','EPSG','8252','EPSG','17706',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17670','projected_crs','EPSG','22646','EPSG','3880','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22648','NAD83(CSRS)v6 / MTM zone 8',NULL,'EPSG','4496','EPSG','8252','EPSG','17708',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17688','projected_crs','EPSG','22648','EPSG','1429','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22649','NAD83(CSRS)v6 / MTM zone 9',NULL,'EPSG','4496','EPSG','8252','EPSG','17709',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17689','projected_crs','EPSG','22649','EPSG','1430','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22650','NAD83(CSRS)v6 / MTM zone 10',NULL,'EPSG','4496','EPSG','8252','EPSG','17710',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17690','projected_crs','EPSG','22650','EPSG','1431','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22651','NAD83(CSRS)v6 / MTM zone 11',NULL,'EPSG','4400','EPSG','8252','EPSG','17711',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17646','projected_crs','EPSG','22651','EPSG','1432','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22652','NAD83(CSRS)v6 / MTM zone 12',NULL,'EPSG','4400','EPSG','8252','EPSG','17712',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17647','projected_crs','EPSG','22652','EPSG','1433','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22653','NAD83(CSRS)v6 / MTM zone 13',NULL,'EPSG','4400','EPSG','8252','EPSG','17713',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17648','projected_crs','EPSG','22653','EPSG','1434','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22654','NAD83(CSRS)v6 / MTM zone 14',NULL,'EPSG','4400','EPSG','8252','EPSG','17714',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17649','projected_crs','EPSG','22654','EPSG','1435','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22655','NAD83(CSRS)v6 / MTM zone 15',NULL,'EPSG','4400','EPSG','8252','EPSG','17715',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17650','projected_crs','EPSG','22655','EPSG','1436','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22656','NAD83(CSRS)v6 / MTM zone 16',NULL,'EPSG','4400','EPSG','8252','EPSG','17716',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17651','projected_crs','EPSG','22656','EPSG','1437','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22657','NAD83(CSRS)v6 / MTM zone 17',NULL,'EPSG','4400','EPSG','8252','EPSG','17717',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17652','projected_crs','EPSG','22657','EPSG','1438','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22700','Deir ez Zor / Levant Zone',NULL,'EPSG','4499','EPSG','4227','EPSG','19940',NULL,0); INSERT INTO "usage" VALUES('EPSG','6383','projected_crs','EPSG','22700','EPSG','1623','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22707','NAD83(CSRS)v7 / UTM zone 7N',NULL,'EPSG','4400','EPSG','8255','EPSG','16007',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17756','projected_crs','EPSG','22707','EPSG','3409','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22708','NAD83(CSRS)v7 / UTM zone 8N',NULL,'EPSG','4400','EPSG','8255','EPSG','16008',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17837','projected_crs','EPSG','22708','EPSG','3410','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22709','NAD83(CSRS)v7 / UTM zone 9N',NULL,'EPSG','4400','EPSG','8255','EPSG','16009',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17769','projected_crs','EPSG','22709','EPSG','3411','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22710','NAD83(CSRS)v7 / UTM zone 10N',NULL,'EPSG','4400','EPSG','8255','EPSG','16010',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17842','projected_crs','EPSG','22710','EPSG','3412','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22711','NAD83(CSRS)v7 / UTM zone 11N',NULL,'EPSG','4400','EPSG','8255','EPSG','16011',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17781','projected_crs','EPSG','22711','EPSG','3528','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22712','NAD83(CSRS)v7 / UTM zone 12N',NULL,'EPSG','4400','EPSG','8255','EPSG','16012',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17785','projected_crs','EPSG','22712','EPSG','3527','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22713','NAD83(CSRS)v7 / UTM zone 13N',NULL,'EPSG','4400','EPSG','8255','EPSG','16013',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17792','projected_crs','EPSG','22713','EPSG','3526','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22714','NAD83(CSRS)v7 / UTM zone 14N',NULL,'EPSG','4400','EPSG','8255','EPSG','16014',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17798','projected_crs','EPSG','22714','EPSG','3413','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22715','NAD83(CSRS)v7 / UTM zone 15N',NULL,'EPSG','4400','EPSG','8255','EPSG','16015',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17804','projected_crs','EPSG','22715','EPSG','3414','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22716','NAD83(CSRS)v7 / UTM zone 16N',NULL,'EPSG','4400','EPSG','8255','EPSG','16016',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17832','projected_crs','EPSG','22716','EPSG','3415','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22717','NAD83(CSRS)v7 / UTM zone 17N',NULL,'EPSG','4400','EPSG','8255','EPSG','16017',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17819','projected_crs','EPSG','22717','EPSG','3416','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22718','NAD83(CSRS)v7 / UTM zone 18N',NULL,'EPSG','4400','EPSG','8255','EPSG','16018',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17825','projected_crs','EPSG','22718','EPSG','3417','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22719','NAD83(CSRS)v7 / UTM zone 19N',NULL,'EPSG','4400','EPSG','8255','EPSG','16019',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17847','projected_crs','EPSG','22719','EPSG','3524','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22720','NAD83(CSRS)v7 / UTM zone 20N',NULL,'EPSG','4400','EPSG','8255','EPSG','16020',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17855','projected_crs','EPSG','22720','EPSG','3525','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22721','NAD83(CSRS)v7 / UTM zone 21N',NULL,'EPSG','4400','EPSG','8255','EPSG','16021',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17860','projected_crs','EPSG','22721','EPSG','2151','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22722','NAD83(CSRS)v7 / UTM zone 22N',NULL,'EPSG','4400','EPSG','8255','EPSG','16022',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17866','projected_crs','EPSG','22722','EPSG','2152','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22739','NAD83(CSRS)v7 / PEI Stereographic',NULL,'EPSG','4496','EPSG','8255','EPSG','19960',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17675','projected_crs','EPSG','22739','EPSG','1533','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','22762','NAD83(CSRS)v7 / Alberta 3TM ref merid 111 W',NULL,'EPSG','4400','EPSG','8255','EPSG','17722',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17661','projected_crs','EPSG','22762','EPSG','3543','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22763','NAD83(CSRS)v7 / Alberta 3TM ref merid 114 W',NULL,'EPSG','4400','EPSG','8255','EPSG','17723',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17662','projected_crs','EPSG','22763','EPSG','3542','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22764','NAD83(CSRS)v7 / Alberta 3TM ref merid 117 W',NULL,'EPSG','4400','EPSG','8255','EPSG','17724',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17663','projected_crs','EPSG','22764','EPSG','3541','EPSG','1096'); +INSERT INTO "projected_crs" VALUES('EPSG','22765','NAD83(CSRS)v7 / Alberta 3TM ref merid 120 W',NULL,'EPSG','4400','EPSG','8255','EPSG','17726',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17664','projected_crs','EPSG','22765','EPSG','3540','EPSG','1096'); INSERT INTO "projected_crs" VALUES('EPSG','22770','Deir ez Zor / Syria Lambert',NULL,'EPSG','4499','EPSG','4227','EPSG','19948',NULL,0); INSERT INTO "usage" VALUES('EPSG','6384','projected_crs','EPSG','22770','EPSG','1623','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','22780','Deir ez Zor / Levant Stereographic',NULL,'EPSG','4499','EPSG','4227','EPSG','19949',NULL,0); @@ -9925,6 +10201,8 @@ INSERT INTO "usage" VALUES('EPSG','7244','projected_crs','EPSG','32157','EPSG','2272','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','32158','NAD83 / Wyoming West',NULL,'EPSG','4499','EPSG','4269','EPSG','14934',NULL,0); INSERT INTO "usage" VALUES('EPSG','7245','projected_crs','EPSG','32158','EPSG','2271','EPSG','1142'); +INSERT INTO "projected_crs" VALUES('EPSG','32159','NAD83 / Wyoming Lambert',NULL,'EPSG','4499','EPSG','4269','EPSG','14930',NULL,0); +INSERT INTO "usage" VALUES('EPSG','17409','projected_crs','EPSG','32159','EPSG','1419','EPSG','1135'); INSERT INTO "projected_crs" VALUES('EPSG','32161','NAD83 / Puerto Rico & Virgin Is.',NULL,'EPSG','4499','EPSG','4269','EPSG','15230',NULL,0); INSERT INTO "usage" VALUES('EPSG','7246','projected_crs','EPSG','32161','EPSG','2251','EPSG','1142'); INSERT INTO "projected_crs" VALUES('EPSG','32164','NAD83 / BLM 14N (ftUS)',NULL,'EPSG','4497','EPSG','4269','EPSG','15914',NULL,0); diff -Nru proj-9.0.0/data/sql/scope.sql proj-9.0.1/data/sql/scope.sql --- proj-9.0.0/data/sql/scope.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/scope.sql 2022-04-29 18:18:53.000000000 +0000 @@ -254,6 +254,7 @@ INSERT INTO "scope" VALUES('EPSG','1275','Alignment of datasets referenced to WGS 84 which have been derived from GDA2020 via the null transformation EPSG::8450 with GDA94 datasets.',0); INSERT INTO "scope" VALUES('EPSG','1276','Alignment of datasets referenced to WGS 84 which have been derived from GDA94 via the null transformation EPSG::1150 with GDA2020 datasets.',0); INSERT INTO "scope" VALUES('EPSG','1277','Derivation of depths from GNSS observations.',0); +INSERT INTO "scope" VALUES('EPSG','1278','Transformation of coordinates at 0.006m level of accuracy.',0); INSERT INTO "scope" VALUES('EPSG','1280','Readjustment of coordinates to account for ground deformation caused by 2011 Tohoku earthquake.',0); INSERT INTO "scope" VALUES('EPSG','1281','Geodesy. Defines LUREF from 2006 to 2014.',0); INSERT INTO "scope" VALUES('EPSG','1282','Geodesy. Defines LUREF from 2014 to 2020.',0); diff -Nru proj-9.0.0/data/sql/supersession.sql proj-9.0.1/data/sql/supersession.sql --- proj-9.0.0/data/sql/supersession.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/supersession.sql 2022-04-29 18:18:53.000000000 +0000 @@ -258,3 +258,8 @@ INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','5485','helmert_transformation','EPSG','9899','EPSG',1); INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','9898','helmert_transformation','EPSG','9937','EPSG',1); INSERT INTO "supersession" VALUES('helmert_transformation','EPSG','9899','helmert_transformation','EPSG','9938','EPSG',1); +INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9954','grid_transformation','EPSG','9956','EPSG',0); +INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9955','grid_transformation','EPSG','9957','EPSG',0); +INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9956','grid_transformation','EPSG','9958','EPSG',0); +INSERT INTO "supersession" VALUES('grid_transformation','EPSG','9957','grid_transformation','EPSG','9959','EPSG',0); +INSERT INTO "supersession" VALUES('grid_transformation','EPSG','5891','grid_transformation','EPSG','9910','EPSG',1); diff -Nru proj-9.0.0/data/sql/vertical_crs.sql proj-9.0.1/data/sql/vertical_crs.sql --- proj-9.0.0/data/sql/vertical_crs.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/vertical_crs.sql 2022-06-07 18:31:42.000000000 +0000 @@ -363,7 +363,7 @@ INSERT INTO "vertical_crs" VALUES('EPSG','7979','KOC WD height',NULL,'EPSG','6499','EPSG','5187',0); INSERT INTO "usage" VALUES('EPSG','5571','vertical_crs','EPSG','7979','EPSG','3267','EPSG','1205'); INSERT INTO "vertical_crs" VALUES('EPSG','8089','ISH2004 height',NULL,'EPSG','6499','EPSG','1190',0); -INSERT INTO "usage" VALUES('EPSG','5616','vertical_crs','EPSG','8089','EPSG','3262','EPSG','1178'); +INSERT INTO "usage" VALUES('EPSG','5616','vertical_crs','EPSG','8089','EPSG','4662','EPSG','1178'); INSERT INTO "vertical_crs" VALUES('EPSG','8266','GVR2000 height',NULL,'EPSG','6499','EPSG','1199',0); INSERT INTO "usage" VALUES('EPSG','5758','vertical_crs','EPSG','8266','EPSG','4461','EPSG','1153'); INSERT INTO "vertical_crs" VALUES('EPSG','8267','GVR2016 height',NULL,'EPSG','6499','EPSG','1200',0); @@ -466,6 +466,8 @@ INSERT INTO "usage" VALUES('EPSG','17285','vertical_crs','EPSG','9923','EPSG','3339','EPSG','1141'); INSERT INTO "vertical_crs" VALUES('EPSG','9927','GNTRANS2016 height',NULL,'EPSG','6499','EPSG','1318',0); INSERT INTO "usage" VALUES('EPSG','17286','vertical_crs','EPSG','9927','EPSG','3339','EPSG','1141'); +INSERT INTO "vertical_crs" VALUES('EPSG','20000','SVD2006 height',NULL,'EPSG','6499','EPSG','1323',0); +INSERT INTO "usage" VALUES('EPSG','17962','vertical_crs','EPSG','20000','EPSG','4058','EPSG','1180'); INSERT INTO "vertical_crs" VALUES('EPSG','5336','Black Sea depth',NULL,'EPSG','6498','EPSG','5134',0); INSERT INTO "usage" VALUES('EPSG','3936','vertical_crs','EPSG','5336','EPSG','1102','EPSG','1198'); INSERT INTO "vertical_crs" VALUES('EPSG','5612','Baltic 1977 depth',NULL,'EPSG','6498','EPSG','5105',0); diff -Nru proj-9.0.0/data/sql/vertical_datum.sql proj-9.0.1/data/sql/vertical_datum.sql --- proj-9.0.0/data/sql/vertical_datum.sql 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/data/sql/vertical_datum.sql 2022-06-07 18:31:42.000000000 +0000 @@ -133,7 +133,7 @@ INSERT INTO "vertical_datum" VALUES('EPSG','1177','St. Helena Vertical Datum 2015',NULL,'2015-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13229','vertical_datum','EPSG','1177','EPSG','3183','EPSG','1178'); INSERT INTO "vertical_datum" VALUES('EPSG','1190','Landshaedarkerfi Islands 2004',NULL,'2004-08-07',NULL,NULL,NULL,0); -INSERT INTO "usage" VALUES('EPSG','13242','vertical_datum','EPSG','1190','EPSG','3262','EPSG','1180'); +INSERT INTO "usage" VALUES('EPSG','13242','vertical_datum','EPSG','1190','EPSG','4662','EPSG','1180'); INSERT INTO "vertical_datum" VALUES('EPSG','1199','Greenland Vertical Reference 2000',NULL,'2000-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13251','vertical_datum','EPSG','1199','EPSG','4461','EPSG','1153'); INSERT INTO "vertical_datum" VALUES('EPSG','1200','Greenland Vertical Reference 2016',NULL,'2016-01-01',NULL,NULL,NULL,0); @@ -232,6 +232,8 @@ INSERT INTO "usage" VALUES('EPSG','17277','vertical_datum','EPSG','1316','EPSG','3339','EPSG','1141'); INSERT INTO "vertical_datum" VALUES('EPSG','1318','GNTRANS2016',NULL,'2016-01-01',NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','17278','vertical_datum','EPSG','1318','EPSG','3339','EPSG','1141'); +INSERT INTO "vertical_datum" VALUES('EPSG','1323','Svalbard vertical datum 2006',NULL,'2006-01-01',NULL,NULL,NULL,0); +INSERT INTO "usage" VALUES('EPSG','17963','vertical_datum','EPSG','1323','EPSG','4058','EPSG','1180'); INSERT INTO "vertical_datum" VALUES('EPSG','5100','Mean Sea Level',NULL,NULL,NULL,NULL,NULL,0); INSERT INTO "usage" VALUES('EPSG','13307','vertical_datum','EPSG','5100','EPSG','1262','EPSG','1199'); INSERT INTO "vertical_datum" VALUES('EPSG','5101','Ordnance Datum Newlyn',NULL,'1956-01-01',NULL,NULL,NULL,0); diff -Nru proj-9.0.0/debian/changelog proj-9.0.1/debian/changelog --- proj-9.0.0/debian/changelog 2022-03-22 04:21:32.000000000 +0000 +++ proj-9.0.1/debian/changelog 2022-06-15 14:20:21.000000000 +0000 @@ -1,3 +1,27 @@ +proj (9.0.1-1) unstable; urgency=medium + + * New upstream release. + * Update symbols for other architectures. + * Move from experimental to unstable. + + -- Bas Couwenberg Wed, 15 Jun 2022 16:20:21 +0200 + +proj (9.0.1~rc2-1~exp1) experimental; urgency=medium + + * New upstream release candidate. + * Update symbols for other architectures. + * Drop soversion.patch, applied upstream. + + -- Bas Couwenberg Wed, 08 Jun 2022 20:23:37 +0200 + +proj (9.0.1~rc1-1~exp1) experimental; urgency=medium + + * New upstream release candidate. + * Drop SQLite 3.38.0 patch, included upstream. + * Add patch to revert SOVERSION bump. + + -- Bas Couwenberg Wed, 08 Jun 2022 18:19:10 +0200 + proj (9.0.0-1) unstable; urgency=medium * Move from experimental to unstable. diff -Nru proj-9.0.0/debian/libproj25.symbols proj-9.0.1/debian/libproj25.symbols --- proj-9.0.0/debian/libproj25.symbols 2022-03-22 04:17:25.000000000 +0000 +++ proj-9.0.1/debian/libproj25.symbols 2022-06-15 14:18:32.000000000 +0000 @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 9.0.0 amd64 hppa +# SymbolsHelper-Confirmed: 9.0.1~rc2 amd64 arm64 hurd-i386 libproj.so.25 #PACKAGE# #MINVER# * Build-Depends-Package: libproj-dev _Z10pj_ell_setP6pj_ctxP8ARG_listPdS3_@Base 8.0.0 @@ -1928,7 +1928,7 @@ (optional=templinst)_ZNSt6vectorISt10unique_ptrIN5osgeo4proj19HorizontalShiftGridESt14default_deleteIS3_EESaIS6_EE12emplace_backIJS6_EEEvDpOT_@Base 9.0.0~rc1 (optional=templinst)_ZNSt6vectorISt10unique_ptrIN5osgeo4proj20VerticalShiftGridSetESt14default_deleteIS3_EESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_@Base 7.0.0 (optional=templinst)_ZNSt6vectorISt10unique_ptrIN5osgeo4proj22HorizontalShiftGridSetESt14default_deleteIS3_EESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_@Base 7.0.0 - (optional=templinst)_ZNSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaIS7_EE12emplace_backIJS7_EEEvDpOT_@Base 9.0.0 + (optional=templinst|arch=amd64 arm64 x32)_ZNSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaIS7_EE12emplace_backIJS7_EEEvDpOT_@Base 9.0.0 (optional=templinst)_ZNSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaIS7_EE17_M_realloc_insertIJS7_EEEvN9__gnu_cxx17__normal_iteratorIPS7_S9_EEDpOT_@Base 6.0.0 (optional=templinst)_ZNSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaIS7_EED1Ev@Base 8.1.0 (optional=templinst)_ZNSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaIS7_EED2Ev@Base 8.1.0 diff -Nru proj-9.0.0/debian/patches/0001-Fix-wrong-results-with-SQLite-3.38.0-fixes-3077.patch proj-9.0.1/debian/patches/0001-Fix-wrong-results-with-SQLite-3.38.0-fixes-3077.patch --- proj-9.0.0/debian/patches/0001-Fix-wrong-results-with-SQLite-3.38.0-fixes-3077.patch 2022-03-22 04:17:25.000000000 +0000 +++ proj-9.0.1/debian/patches/0001-Fix-wrong-results-with-SQLite-3.38.0-fixes-3077.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -Description: Fix wrong results with SQLite 3.38.0 (fixes #3077) -Author: Even Rouault -Origin: https://github.com/OSGeo/PROJ/commit/bd2326210253cce5bf60626825d60da52f24cc53 -Bug: https://github.com/OSGeo/PROJ/issues/3077 - ---- a/src/iso19111/factory.cpp -+++ b/src/iso19111/factory.cpp -@@ -252,7 +252,7 @@ class SQLiteHandle { - } - - // cppcheck-suppress functionStatic -- void registerFunctions(); -+ void initialize(); - - SQLResultSet run(const std::string &sql, - const ListOfParams ¶meters = ListOfParams(), -@@ -344,7 +344,7 @@ std::shared_ptr SQLiteHand - #ifdef ENABLE_CUSTOM_LOCKLESS_VFS - handle->vfs_ = std::move(vfs); - #endif -- handle->registerFunctions(); -+ handle->initialize(); - handle->checkDatabaseLayout(path, path, std::string()); - return handle; - } -@@ -359,7 +359,7 @@ SQLiteHandle::initFromExisting(sqlite3 * - new SQLiteHandle(sqlite_handle, close_handle)); - handle->nLayoutVersionMajor_ = nLayoutVersionMajor; - handle->nLayoutVersionMinor_ = nLayoutVersionMinor; -- handle->registerFunctions(); -+ handle->initialize(); - return handle; - } - -@@ -370,7 +370,7 @@ SQLiteHandle::initFromExistingUniquePtr( - bool close_handle) { - auto handle = std::unique_ptr( - new SQLiteHandle(sqlite_handle, close_handle)); -- handle->registerFunctions(); -+ handle->initialize(); - return handle; - } - -@@ -547,7 +547,18 @@ void SQLiteHandle::checkDatabaseLayout(c - #define SQLITE_DETERMINISTIC 0 - #endif - --void SQLiteHandle::registerFunctions() { -+void SQLiteHandle::initialize() { -+ -+ // There is a bug in sqlite 3.38.0 with some complex queries. -+ // Cf https://github.com/OSGeo/PROJ/issues/3077 -+ // Disabling Bloom-filter pull-down optimization as suggested in -+ // https://sqlite.org/forum/forumpost/7d3a75438c -+ const int sqlite3VersionNumber = sqlite3_libversion_number(); -+ if (sqlite3VersionNumber == 3 * 1000000 + 38 * 1000) { -+ sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite_handle_, -+ 0x100000); -+ } -+ - sqlite3_create_function(sqlite_handle_, "pseudo_area_from_swne", 4, - SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr, - PROJ_SQLITE_pseudo_area_from_swne, nullptr, diff -Nru proj-9.0.0/debian/patches/series proj-9.0.1/debian/patches/series --- proj-9.0.0/debian/patches/series 2022-03-22 04:17:25.000000000 +0000 +++ proj-9.0.1/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -0001-Fix-wrong-results-with-SQLite-3.38.0-fixes-3077.patch diff -Nru proj-9.0.0/include/proj/datum.hpp proj-9.0.1/include/proj/datum.hpp --- proj-9.0.0/include/proj/datum.hpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/include/proj/datum.hpp 2022-03-25 07:13:55.000000000 +0000 @@ -432,6 +432,10 @@ util::IComparable::Criterion criterion = util::IComparable::Criterion::STRICT, const io::DatabaseContextPtr &dbContext = nullptr) const override; + + PROJ_INTERNAL bool isEquivalentToNoExactTypeCheck( + const util::IComparable *other, util::IComparable::Criterion criterion, + const io::DatabaseContextPtr &dbContext) const; //! @endcond protected: @@ -587,6 +591,10 @@ util::IComparable::Criterion::STRICT, const io::DatabaseContextPtr &dbContext = nullptr) const override; + PROJ_INTERNAL bool isEquivalentToNoExactTypeCheck( + const util::IComparable *other, util::IComparable::Criterion criterion, + const io::DatabaseContextPtr &dbContext) const; + PROJ_INTERNAL void _exportToWKT(io::WKTFormatter *formatter) const override; // throw(io::FormattingException) diff -Nru proj-9.0.0/man/CMakeLists.txt proj-9.0.1/man/CMakeLists.txt --- proj-9.0.0/man/CMakeLists.txt 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/CMakeLists.txt 2022-03-25 07:13:55.000000000 +0000 @@ -6,4 +6,4 @@ man1/gie.1 man1/projinfo.1 man1/projsync.1 - DESTINATION share/man/man1) + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) diff -Nru proj-9.0.0/man/man1/cct.1 proj-9.0.1/man/man1/cct.1 --- proj-9.0.0/man/man1/cct.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/cct.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "CCT" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -cct \- Coordinate Conversion and Transformation . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "CCT" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +cct \- Coordinate Conversion and Transformation .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/man/man1/cs2cs.1 proj-9.0.1/man/man1/cs2cs.1 --- proj-9.0.0/man/man1/cs2cs.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/cs2cs.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "CS2CS" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -cs2cs \- Cartographic coordinate system filter . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "CS2CS" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +cs2cs \- Cartographic coordinate system filter .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/man/man1/geod.1 proj-9.0.1/man/man1/geod.1 --- proj-9.0.0/man/man1/geod.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/geod.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "GEOD" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -geod \- Geodesic computations . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "GEOD" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +geod \- Geodesic computations .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/man/man1/gie.1 proj-9.0.1/man/man1/gie.1 --- proj-9.0.0/man/man1/gie.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/gie.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "GIE" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -gie \- The Geospatial Integrity Investigation Environment . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "GIE" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +gie \- The Geospatial Integrity Investigation Environment .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/man/man1/proj.1 proj-9.0.1/man/man1/proj.1 --- proj-9.0.0/man/man1/proj.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/proj.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "PROJ" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -proj \- Cartographic projection filter . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "PROJ" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +proj \- Cartographic projection filter .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/man/man1/projinfo.1 proj-9.0.1/man/man1/projinfo.1 --- proj-9.0.0/man/man1/projinfo.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/projinfo.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "PROJINFO" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -projinfo \- Geodetic object and coordinate operation queries . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "PROJINFO" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +projinfo \- Geodetic object and coordinate operation queries .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/man/man1/projsync.1 proj-9.0.1/man/man1/projsync.1 --- proj-9.0.0/man/man1/projsync.1 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/man/man1/projsync.1 2022-06-08 15:59:53.000000000 +0000 @@ -1,8 +1,5 @@ .\" Man page generated from reStructuredText. . -.TH "PROJSYNC" "1" "Mar 1, 2022" "9.0.0" "PROJ" -.SH NAME -projsync \- Downloading tool of resource files . .nr rst2man-indent-level 0 . @@ -30,6 +27,9 @@ .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. +.TH "PROJSYNC" "1" "Jun 15, 2022" "9.0.1" "PROJ" +.SH NAME +projsync \- Downloading tool of resource files .SH SYNOPSIS .INDENT 0.0 .INDENT 3.5 diff -Nru proj-9.0.0/NEWS proj-9.0.1/NEWS --- proj-9.0.0/NEWS 2022-02-23 18:51:03.000000000 +0000 +++ proj-9.0.1/NEWS 2022-06-15 13:59:36.000000000 +0000 @@ -1,3 +1,69 @@ +9.0.1 Release Notes +------------------- + + Database updates + ------- + + o Update to EPSG 10.064 (#3208) + + o Add OGC:CRS84h (WGS 84 longitude-latitude-height) (#3155) + + Bug fixes + --------- + + o Use CMAKE_INSTALL_MANDIR to override default (#3081) + + o Increase MAX_ITER so Mollweide forward projection works near the poles (#3082) + + o Fix wrong results with SQLite 3.38.0 (#3091) + + o Fix issue when transforming from/to BoundCRS of 3D CRS with non-Greenwich + prime meridian, created from WKT (#3098) + + o Fix issues with WKT of concatenated operations (#3105) + + o CMake: fix installation of proj.pc on Windows (#3109) + + o createOperations(): fix issue in transformation northing, easting + projected CRS -> +proj=longlat +lon_wrap (#3110) + + o unitconvert: round to nearest date when converting to yyyymmdd (#3111) + + o Fix comparison of GeodeticRefrenceFrame vs DynamicGeodeticReferenceFrame (#3120) + + o createOperations(): fix transformation involving CompoundCRS, ToWGS84 + and PROJ4_GRIDS (#3124) + + o Fix datum names when importing from PROJ4 crs strings (affects some + transformations using geoidgrids) (#3129) + + o Deal with PARAMETER["EPSG code for Interpolation CRS",crs_code] (#3149) + + o createOperations(): fix CompoundCRS[BoundCRS[ProjectedCRS],BoundCRS[VerticalCRS]] + to Geog3DCrs (#3151) + + o ITRF2014: fix ITRF2014:ITRF88,ITRF94 and ITRF96 definitions (#3159) + + o createBoundCRSToWGS84IfPossible(): improve selection logic to generate +towgs84= + taking into account extent (#3160) + + o createOperations(): fix some complex cases involving TOWGS84 and CompoundCRS (#3163) + + o Fix cmake CURL dependency, update appveyor - vcpkg interaction (#3185) + + o WKT import: deal with Projected CRS that is a mix of WKT1:GDAL / WKT1:ESRI (#3189) + + o createOperations(): fix/improve result of 'BD72 + Ostend height ' to 'WGS84+EGM96 height' (#3199) + + o Identifier::isEquivalentName(): fix when ending by ' + ' which could indirectly cause + an infinite stack call in master (#3202) + + o WKT import: correctly deal with absence of Latitude_Of_Origin parameter in + WKT1 ESRI with Stereographic projection (#3212) + + o PROJJSON parser: do not error out if a datum ensemble member is unknown in the database (#3223) + + 9.0.0 Release Notes ------------------- diff -Nru proj-9.0.0/src/conversions/unitconvert.cpp proj-9.0.1/src/conversions/unitconvert.cpp --- proj-9.0.0/src/conversions/unitconvert.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/conversions/unitconvert.cpp 2022-03-25 07:13:55.000000000 +0000 @@ -252,21 +252,22 @@ /***********************************************************************/ static double mjd_to_yyyymmdd(double mjd) { /************************************************************************ - Date given in YYYY-MM-DD format. + Date returned in YYYY-MM-DD format. ************************************************************************/ - double mjd_iter = 14 + 31; - int year = 1859, month=0, day=0; + unsigned int date_iter = 14 + 31; + unsigned int year = 1859, month = 0, day = 0; + unsigned int date = (int) lround(mjd); - for (; mjd >= mjd_iter; year++) { - mjd_iter += days_in_year(year); + for (; date >= date_iter; year++) { + date_iter += days_in_year(year); } year--; - mjd_iter -= days_in_year(year); + date_iter -= days_in_year(year); - for (month=1; mjd_iter + days_in_month(year, month) <= mjd; month++) - mjd_iter += days_in_month(year, month); + for (month=1; date_iter + days_in_month(year, month) <= date; month++) + date_iter += days_in_month(year, month); - day = (int)(mjd - mjd_iter + 1); + day = date - date_iter + 1; return year*10000.0 + month*100.0 + day; } diff -Nru proj-9.0.0/src/iso19111/crs.cpp proj-9.0.1/src/iso19111/crs.cpp --- proj-9.0.0/src/iso19111/crs.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/crs.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -574,6 +574,8 @@ operation::CoordinateOperationFactory::create() ->createOperations(NN_NO_CHECK(geodCRS), hubCRS, ctxt); CRSPtr candidateBoundCRS; + int candidateCount = 0; + bool candidateHasExactlyMachingExtent = false; for (const auto &op : list) { auto transf = util::nn_dynamic_pointer_cast( @@ -584,13 +586,31 @@ } catch (const std::exception &) { continue; } + bool unused = false; + auto opExtent = + getExtent(NN_NO_CHECK(transf), false, unused); + const bool exactlyMatchingExtent = + opExtent && extentResolved && + opExtent->contains(NN_NO_CHECK(extentResolved)) && + extentResolved->contains(NN_NO_CHECK(opExtent)); if (candidateBoundCRS) { - candidateBoundCRS = nullptr; - break; + if (exactlyMatchingExtent && + !candidateHasExactlyMachingExtent) { + candidateBoundCRS = nullptr; + } else if (exactlyMatchingExtent == + candidateHasExactlyMachingExtent) { + candidateCount++; + } + } + if (candidateBoundCRS == nullptr) { + candidateCount = 1; + candidateHasExactlyMachingExtent = + exactlyMatchingExtent; + candidateBoundCRS = + BoundCRS::create(thisAsCRS, hubCRS, + NN_NO_CHECK(transf)) + .as_nullable(); } - candidateBoundCRS = - BoundCRS::create(thisAsCRS, hubCRS, NN_NO_CHECK(transf)) - .as_nullable(); } else { auto concatenated = dynamic_cast( @@ -621,21 +641,42 @@ } catch (const std::exception &) { continue; } + bool unused = false; + auto opExtent = getExtent( + NN_NO_CHECK(transf), false, unused); + const bool exactlyMatchingExtent = + opExtent && extentResolved && + opExtent->contains( + NN_NO_CHECK(extentResolved)) && + extentResolved->contains( + NN_NO_CHECK(opExtent)); if (candidateBoundCRS) { - candidateBoundCRS = nullptr; - break; + if (exactlyMatchingExtent && + !candidateHasExactlyMachingExtent) { + candidateBoundCRS = nullptr; + } else if ( + exactlyMatchingExtent == + candidateHasExactlyMachingExtent) { + candidateCount++; + } + } + if (candidateBoundCRS == nullptr) { + candidateCount = 1; + candidateHasExactlyMachingExtent = + exactlyMatchingExtent; + candidateBoundCRS = + BoundCRS::create( + thisAsCRS, hubCRS, + NN_NO_CHECK(transf)) + .as_nullable(); } - candidateBoundCRS = - BoundCRS::create(thisAsCRS, hubCRS, - NN_NO_CHECK(transf)) - .as_nullable(); } } } } } } - if (candidateBoundCRS) { + if (candidateCount == 1 && candidateBoundCRS) { return NN_NO_CHECK(candidateBoundCRS); } } catch (const std::exception &) { @@ -1460,7 +1501,8 @@ const auto &thisDatum = d->datum; const auto &otherDatum = otherSingleCRS->d->datum; if (thisDatum) { - if (!thisDatum->_isEquivalentTo(otherDatum.get(), criterion, + if (otherDatum == nullptr || + !thisDatum->_isEquivalentTo(otherDatum.get(), criterion, dbContext)) { return false; } @@ -1473,7 +1515,8 @@ const auto &thisDatumEnsemble = d->datumEnsemble; const auto &otherDatumEnsemble = otherSingleCRS->d->datumEnsemble; if (thisDatumEnsemble) { - if (!thisDatumEnsemble->_isEquivalentTo(otherDatumEnsemble.get(), + if (otherDatumEnsemble == nullptr || + !thisDatumEnsemble->_isEquivalentTo(otherDatumEnsemble.get(), criterion, dbContext)) { return false; } @@ -4404,7 +4447,8 @@ formatter->addParam("units", "m"); } - if (!axisSpecFound && !formatter->getCRSExport()) { + if (!axisSpecFound && + (!formatter->getCRSExport() || formatter->getLegacyCRSToCRSContext())) { const auto &dir0 = axisList[0]->direction(); const auto &dir1 = axisList[1]->direction(); if (!(&dir0 == &cs::AxisDirection::EAST && diff -Nru proj-9.0.0/src/iso19111/datum.cpp proj-9.0.1/src/iso19111/datum.cpp --- proj-9.0.0/src/iso19111/datum.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/datum.cpp 2022-03-25 07:13:55.000000000 +0000 @@ -1414,7 +1414,8 @@ // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress -bool GeodeticReferenceFrame::_isEquivalentTo( + +bool GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { auto otherGRF = dynamic_cast(other); @@ -1427,6 +1428,19 @@ ellipsoid()->_isEquivalentTo(otherGRF->ellipsoid().get(), criterion, dbContext); } + +// --------------------------------------------------------------------------- + +bool GeodeticReferenceFrame::_isEquivalentTo( + const util::IComparable *other, util::IComparable::Criterion criterion, + const io::DatabaseContextPtr &dbContext) const { + if (criterion == Criterion::STRICT && + !util::isOfExactType(*other)) { + return false; + } + return isEquivalentToNoExactTypeCheck(other, criterion, dbContext); +} + //! @endcond // --------------------------------------------------------------------------- @@ -1558,11 +1572,20 @@ bool DynamicGeodeticReferenceFrame::_isEquivalentTo( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { - auto otherDGRF = dynamic_cast(other); - if (otherDGRF == nullptr || - !GeodeticReferenceFrame::_isEquivalentTo(other, criterion, dbContext)) { + if (criterion == Criterion::STRICT && + !util::isOfExactType(*other)) { return false; } + if (!GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck( + other, criterion, dbContext)) { + return false; + } + auto otherDGRF = dynamic_cast(other); + if (otherDGRF == nullptr) { + // we can go here only if criterion != Criterion::STRICT, and thus + // given the above check we can consider the objects equivalent. + return true; + } return frameReferenceEpoch()._isEquivalentTo( otherDGRF->frameReferenceEpoch(), criterion) && metadata::Identifier::isEquivalentName( @@ -2101,7 +2124,7 @@ // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress -bool VerticalReferenceFrame::_isEquivalentTo( +bool VerticalReferenceFrame::isEquivalentToNoExactTypeCheck( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { auto otherVRF = dynamic_cast(other); @@ -2121,6 +2144,19 @@ } return true; } + +// --------------------------------------------------------------------------- + +bool VerticalReferenceFrame::_isEquivalentTo( + const util::IComparable *other, util::IComparable::Criterion criterion, + const io::DatabaseContextPtr &dbContext) const { + if (criterion == Criterion::STRICT && + !util::isOfExactType(*other)) { + return false; + } + return isEquivalentToNoExactTypeCheck(other, criterion, dbContext); +} + //! @endcond // --------------------------------------------------------------------------- @@ -2195,11 +2231,20 @@ bool DynamicVerticalReferenceFrame::_isEquivalentTo( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { - auto otherDGRF = dynamic_cast(other); - if (otherDGRF == nullptr || - !VerticalReferenceFrame::_isEquivalentTo(other, criterion, dbContext)) { + if (criterion == Criterion::STRICT && + !util::isOfExactType(*other)) { return false; } + if (!VerticalReferenceFrame::isEquivalentToNoExactTypeCheck( + other, criterion, dbContext)) { + return false; + } + auto otherDGRF = dynamic_cast(other); + if (otherDGRF == nullptr) { + // we can go here only if criterion != Criterion::STRICT, and thus + // given the above check we can consider the objects equivalent. + return true; + } return frameReferenceEpoch()._isEquivalentTo( otherDGRF->frameReferenceEpoch(), criterion) && metadata::Identifier::isEquivalentName( diff -Nru proj-9.0.0/src/iso19111/factory.cpp proj-9.0.1/src/iso19111/factory.cpp --- proj-9.0.0/src/iso19111/factory.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/factory.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -252,7 +252,7 @@ } // cppcheck-suppress functionStatic - void registerFunctions(); + void initialize(); SQLResultSet run(const std::string &sql, const ListOfParams ¶meters = ListOfParams(), @@ -344,7 +344,7 @@ #ifdef ENABLE_CUSTOM_LOCKLESS_VFS handle->vfs_ = std::move(vfs); #endif - handle->registerFunctions(); + handle->initialize(); handle->checkDatabaseLayout(path, path, std::string()); return handle; } @@ -359,7 +359,7 @@ new SQLiteHandle(sqlite_handle, close_handle)); handle->nLayoutVersionMajor_ = nLayoutVersionMajor; handle->nLayoutVersionMinor_ = nLayoutVersionMinor; - handle->registerFunctions(); + handle->initialize(); return handle; } @@ -370,7 +370,7 @@ bool close_handle) { auto handle = std::unique_ptr( new SQLiteHandle(sqlite_handle, close_handle)); - handle->registerFunctions(); + handle->initialize(); return handle; } @@ -547,7 +547,18 @@ #define SQLITE_DETERMINISTIC 0 #endif -void SQLiteHandle::registerFunctions() { +void SQLiteHandle::initialize() { + + // There is a bug in sqlite 3.38.0 with some complex queries. + // Cf https://github.com/OSGeo/PROJ/issues/3077 + // Disabling Bloom-filter pull-down optimization as suggested in + // https://sqlite.org/forum/forumpost/7d3a75438c + const int sqlite3VersionNumber = sqlite3_libversion_number(); + if (sqlite3VersionNumber == 3 * 1000000 + 38 * 1000) { + sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite_handle_, + 0x100000); + } + sqlite3_create_function(sqlite_handle_, "pseudo_area_from_swne", 4, SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr, PROJ_SQLITE_pseudo_area_from_swne, nullptr, diff -Nru proj-9.0.0/src/iso19111/io.cpp proj-9.0.1/src/iso19111/io.cpp --- proj-9.0.0/src/iso19111/io.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/io.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -1233,6 +1233,14 @@ //! @cond Doxygen_Suppress struct WKTParser::Private { + + struct ci_less_struct { + bool operator()(const std::string &lhs, + const std::string &rhs) const noexcept { + return ci_less(lhs, rhs); + } + }; + bool strict_ = true; std::list warningList_{}; std::vector toWGS84Parameters_{}; @@ -1356,6 +1364,22 @@ const UnitOfMeasure &defaultLinearUnit, const UnitOfMeasure &defaultAngularUnit); + const ESRIMethodMapping * + getESRIMapping(const WKTNodeNNPtr &projCRSNode, + const WKTNodeNNPtr &projectionNode, + std::map + &mapParamNameToValue); + + ConversionNNPtr + buildProjectionFromESRI(const GeodeticCRSNNPtr &baseGeodCRS, + const WKTNodeNNPtr &projCRSNode, + const WKTNodeNNPtr &projectionNode, + const UnitOfMeasure &defaultLinearUnit, + const UnitOfMeasure &defaultAngularUnit, + const ESRIMethodMapping *esriMapping, + std::map + &mapParamNameToValue); + ConversionNNPtr buildProjectionFromESRI(const GeodeticCRSNNPtr &baseGeodCRS, const WKTNodeNNPtr &projCRSNode, @@ -1408,6 +1432,10 @@ CRSPtr buildCRS(const WKTNodeNNPtr &node); + CRSPtr dealWithEPSGCodeForInterpolationCRSParameter( + std::vector ¶meters, + std::vector &values); + TransformationNNPtr buildCoordinateOperation(const WKTNodeNNPtr &node); ConcatenatedOperationNNPtr @@ -3261,6 +3289,37 @@ // --------------------------------------------------------------------------- +CRSPtr WKTParser::Private::dealWithEPSGCodeForInterpolationCRSParameter( + std::vector ¶meters, + std::vector &values) { + // Transform EPSG hacky PARAMETER["EPSG code for Interpolation CRS", + // crs_epsg_code] into proper interpolation CRS + if (dbContext_ != nullptr) { + for (size_t i = 0; i < parameters.size(); ++i) { + if (parameters[i]->nameStr() == + EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS) { + const int code = + static_cast(values[i]->value().getSIValue()); + try { + auto authFactory = AuthorityFactory::create( + NN_NO_CHECK(dbContext_), Identifier::EPSG); + auto interpolationCRS = + authFactory + ->createGeographicCRS(internal::toString(code)) + .as_nullable(); + parameters.erase(parameters.begin() + i); + values.erase(values.begin() + i); + return interpolationCRS; + } catch (const util::Exception &) { + } + } + } + } + return nullptr; +} + +// --------------------------------------------------------------------------- + TransformationNNPtr WKTParser::Private::buildCoordinateOperation(const WKTNodeNNPtr &node) { const auto *nodeP = node->GP(); @@ -3305,6 +3364,10 @@ consumeParameters(node, false, parameters, values, defaultLinearUnit, defaultAngularUnit); + if (interpolationCRS == nullptr) + interpolationCRS = + dealWithEPSGCodeForInterpolationCRSParameter(parameters, values); + std::vector accuracies; auto &accuracyNode = nodeP->lookForChild(WKTConstants::OPERATIONACCURACY); if (/*!isNull(accuracyNode) && */ accuracyNode->GP()->childrenSize() == 1) { @@ -3448,10 +3511,9 @@ // --------------------------------------------------------------------------- -ConversionNNPtr WKTParser::Private::buildProjectionFromESRI( - const GeodeticCRSNNPtr &baseGeodCRS, const WKTNodeNNPtr &projCRSNode, - const WKTNodeNNPtr &projectionNode, const UnitOfMeasure &defaultLinearUnit, - const UnitOfMeasure &defaultAngularUnit) { +const ESRIMethodMapping *WKTParser::Private::getESRIMapping( + const WKTNodeNNPtr &projCRSNode, const WKTNodeNNPtr &projectionNode, + std::map &mapParamNameToValue) { const std::string esriProjectionName = stripQuotes(projectionNode->GP()->children()[0]); @@ -3460,19 +3522,10 @@ // on the parameters / their values const auto esriMappings = getMappingsFromESRI(esriProjectionName); if (esriMappings.empty()) { - return buildProjectionStandard(baseGeodCRS, projCRSNode, projectionNode, - defaultLinearUnit, defaultAngularUnit); + return nullptr; } - struct ci_less_struct { - bool operator()(const std::string &lhs, - const std::string &rhs) const noexcept { - return ci_less(lhs, rhs); - } - }; - // Build a map of present parameters - std::map mapParamNameToValue; for (const auto &childNode : projCRSNode->GP()->children()) { if (ci_equal(childNode->GP()->value(), WKTConstants::PARAMETER)) { const auto &childNodeChildren = childNode->GP()->children(); @@ -3525,11 +3578,18 @@ bestMatchCount = matchCount; } } - if (esriMapping == nullptr) { - return buildProjectionStandard(baseGeodCRS, projCRSNode, projectionNode, - defaultLinearUnit, defaultAngularUnit); - } + return esriMapping; +} + +// --------------------------------------------------------------------------- + +ConversionNNPtr WKTParser::Private::buildProjectionFromESRI( + const GeodeticCRSNNPtr &baseGeodCRS, const WKTNodeNNPtr &projCRSNode, + const WKTNodeNNPtr &projectionNode, const UnitOfMeasure &defaultLinearUnit, + const UnitOfMeasure &defaultAngularUnit, + const ESRIMethodMapping *esriMapping, + std::map &mapParamNameToValue) { std::map mapWKT2NameToESRIName; for (const auto *param = esriMapping->params; param->esri_name; ++param) { if (param->wkt2_name) { @@ -3537,6 +3597,8 @@ } } + const std::string esriProjectionName = + stripQuotes(projectionNode->GP()->children()[0]); const char *projectionMethodWkt2Name = esriMapping->wkt2_name; if (ci_equal(esriProjectionName, "Krovak")) { const std::string projCRSName = @@ -3549,8 +3611,10 @@ const auto *wkt2_mapping = getMapping(projectionMethodWkt2Name); if (ci_equal(esriProjectionName, "Stereographic")) { try { - if (std::fabs(io::asDouble( - mapParamNameToValue["Latitude_Of_Origin"])) == 90.0) { + const auto iterLatitudeOfOrigin = + mapParamNameToValue.find("Latitude_Of_Origin"); + if (iterLatitudeOfOrigin != mapParamNameToValue.end() && + std::fabs(io::asDouble(iterLatitudeOfOrigin->second)) == 90.0) { wkt2_mapping = getMapping(EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_A); } @@ -3648,6 +3712,26 @@ // --------------------------------------------------------------------------- +ConversionNNPtr WKTParser::Private::buildProjectionFromESRI( + const GeodeticCRSNNPtr &baseGeodCRS, const WKTNodeNNPtr &projCRSNode, + const WKTNodeNNPtr &projectionNode, const UnitOfMeasure &defaultLinearUnit, + const UnitOfMeasure &defaultAngularUnit) { + + std::map mapParamNameToValue; + const auto esriMapping = + getESRIMapping(projCRSNode, projectionNode, mapParamNameToValue); + if (esriMapping == nullptr) { + return buildProjectionStandard(baseGeodCRS, projCRSNode, projectionNode, + defaultLinearUnit, defaultAngularUnit); + } + + return buildProjectionFromESRI(baseGeodCRS, projCRSNode, projectionNode, + defaultLinearUnit, defaultAngularUnit, + esriMapping, mapParamNameToValue); +} + +// --------------------------------------------------------------------------- + ConversionNNPtr WKTParser::Private::buildProjection( const GeodeticCRSNNPtr &baseGeodCRS, const WKTNodeNNPtr &projCRSNode, const WKTNodeNNPtr &projectionNode, const UnitOfMeasure &defaultLinearUnit, @@ -3803,6 +3887,20 @@ std::string projectionName(wkt1ProjectionName); const MethodMapping *mapping = tryToIdentifyWKT1Method ? getMappingFromWKT1(projectionName) : nullptr; + + if (!mapping) { + // Sometimes non-WKT1:ESRI looking WKT can actually use WKT1:ESRI + // projection definitions + std::map mapParamNameToValue; + const auto esriMapping = + getESRIMapping(projCRSNode, projectionNode, mapParamNameToValue); + if (esriMapping != nullptr) { + return buildProjectionFromESRI( + baseGeodCRS, projCRSNode, projectionNode, defaultLinearUnit, + defaultAngularUnit, esriMapping, mapParamNameToValue); + } + } + if (mapping) { mapping = selectSphericalOrEllipsoidal(mapping, baseGeodCRS); } else if (metadata::Identifier::isEquivalentName( @@ -4341,10 +4439,10 @@ sourceCRS->extractGeographicCRS(); sourceTransformationCRS = sourceGeographicCRS; if (sourceGeographicCRS) { - if (sourceGeographicCRS->datum() != nullptr && - sourceGeographicCRS->primeMeridian() - ->longitude() - .getSIValue() != 0.0) { + const auto &sourceDatum = sourceGeographicCRS->datum(); + if (sourceDatum != nullptr && sourceGeographicCRS->primeMeridian() + ->longitude() + .getSIValue() != 0.0) { sourceTransformationCRS = GeographicCRS::create( util::PropertyMap().set( @@ -4354,13 +4452,12 @@ datum::GeodeticReferenceFrame::create( util::PropertyMap().set( common::IdentifiedObject::NAME_KEY, - sourceGeographicCRS->datum()->nameStr() + + sourceDatum->nameStr() + " (with Greenwich prime meridian)"), - sourceGeographicCRS->datum()->ellipsoid(), + sourceDatum->ellipsoid(), util::optional(), datum::PrimeMeridian::GREENWICH), - cs::EllipsoidalCS::createLatitudeLongitude( - common::UnitOfMeasure::DEGREE)) + sourceGeographicCRS->coordinateSystem()) .as_nullable(); } } else { @@ -4709,11 +4806,14 @@ consumeParameters(abridgedNode, true, parameters, values, defaultLinearUnit, defaultAngularUnit); + auto interpolationCRS = + dealWithEPSGCodeForInterpolationCRSParameter(parameters, values); + const auto sourceTransformationCRS( createBoundCRSSourceTransformationCRS(sourceCRS, targetCRS)); auto transformation = Transformation::create( buildProperties(abridgedNode), sourceTransformationCRS, - NN_NO_CHECK(targetCRS), nullptr, buildProperties(methodNode), + NN_NO_CHECK(targetCRS), interpolationCRS, buildProperties(methodNode), parameters, values, std::vector()); return BoundCRS::create(buildProperties(node, false, false), @@ -6153,6 +6253,7 @@ "Unexpected type for value of a \"members\" member"); } auto datumName(getName(memberJ)); + bool datumAdded = false; if (dbContext_ && memberJ.contains("id")) { auto id = getObject(memberJ, "id"); auto authority = getString(id, "authority"); @@ -6169,11 +6270,16 @@ } try { datums.push_back(authFactory->createDatum(codeStr)); + datumAdded = true; } catch (const std::exception &) { - throw ParsingException("No Datum of code " + codeStr); + // Silently ignore, as this isn't necessary an error. + // If an older PROJ version parses a DatumEnsemble object of + // a more recent PROJ version where the datum ensemble got + // a new member, it might be unknown from the older PROJ. } - continue; - } else if (dbContext_) { + } + + if (dbContext_ && !datumAdded) { auto authFactory = AuthorityFactory::create(NN_NO_CHECK(dbContext_), std::string()); auto list = authFactory->createObjectsFromName( @@ -6185,19 +6291,21 @@ throw ParsingException( "DatumEnsemble member is not a datum"); datums.push_back(NN_NO_CHECK(datum)); - continue; + datumAdded = true; } } - // Fallback if no db match - if (hasEllipsoid) { - datums.emplace_back(GeodeticReferenceFrame::create( - buildProperties(memberJ), - buildEllipsoid(getObject(j, "ellipsoid")), - optional(), PrimeMeridian::GREENWICH)); - } else { - datums.emplace_back( - VerticalReferenceFrame::create(buildProperties(memberJ))); + if (!datumAdded) { + // Fallback if no db match + if (hasEllipsoid) { + datums.emplace_back(GeodeticReferenceFrame::create( + buildProperties(memberJ), + buildEllipsoid(getObject(j, "ellipsoid")), + optional(), PrimeMeridian::GREENWICH)); + } else { + datums.emplace_back( + VerticalReferenceFrame::create(buildProperties(memberJ))); + } } } return DatumEnsemble::create( @@ -8130,6 +8238,42 @@ } } + // detect a step and its inverse + if (curStep.inverted != prevStep.inverted && + curStep.name == prevStep.name && + curStepParamCount == prevStepParamCount) { + bool allSame = true; + for (size_t j = 0; j < curStepParamCount; j++) { + if (curStep.paramValues[j] != prevStep.paramValues[j]) { + allSame = false; + break; + } + } + if (allSame) { + deletePrevAndCurIter(); + continue; + } + } + + ++iterCur; + } + } + + { + auto iterCur = steps.begin(); + if (iterCur != steps.end()) { + ++iterCur; + } + while (iterCur != steps.end()) { + + assert(iterCur != steps.begin()); + auto iterPrev = std::prev(iterCur); + auto &prevStep = *iterPrev; + auto &curStep = *iterCur; + + const auto curStepParamCount = curStep.paramValues.size(); + const auto prevStepParamCount = prevStep.paramValues.size(); + // +step +proj=hgridshift +grids=grid_A // +step +proj=vgridshift [...] <== curStep // +step +inv +proj=hgridshift +grids=grid_A @@ -8168,19 +8312,102 @@ } } - // detect a step and its inverse - if (curStep.inverted != prevStep.inverted && - curStep.name == prevStep.name && - curStepParamCount == prevStepParamCount) { - bool allSame = true; - for (size_t j = 0; j < curStepParamCount; j++) { - if (curStep.paramValues[j] != prevStep.paramValues[j]) { - allSame = false; - break; + // +step +proj=unitconvert +xy_in=rad +xy_out=deg + // +step +proj=axisswap +order=2,1 + // +step +proj=push +v_1 +v_2 + // +step +proj=axisswap +order=2,1 + // +step +proj=unitconvert +xy_in=deg +xy_out=rad + // +step +proj=vgridshift ... + // +step +proj=unitconvert +xy_in=rad +xy_out=deg + // +step +proj=axisswap +order=2,1 + // +step +proj=pop +v_1 +v_2 + // ==> + // +step +proj=vgridshift ... + // +step +proj=unitconvert +xy_in=rad +xy_out=deg + // +step +proj=axisswap +order=2,1 + if (prevStep.name == "unitconvert" && prevStepParamCount == 2 && + prevStep.paramValues[0].equals("xy_in", "rad") && + prevStep.paramValues[1].equals("xy_out", "deg") && + curStep.name == "axisswap" && curStepParamCount == 1 && + curStep.paramValues[0].equals("order", "2,1")) { + auto iterNext = std::next(iterCur); + bool ok = false; + if (iterNext != steps.end()) { + auto &nextStep = *iterNext; + if (nextStep.name == "push" && + nextStep.paramValues.size() == 2 && + nextStep.paramValues[0].keyEquals("v_1") && + nextStep.paramValues[1].keyEquals("v_2")) { + ok = true; + iterNext = std::next(iterNext); } } - if (allSame) { - deletePrevAndCurIter(); + if (ok && iterNext != steps.end()) { + ok = false; + auto &nextStep = *iterNext; + if (nextStep.name == "axisswap" && + nextStep.paramValues.size() == 1 && + nextStep.paramValues[0].equals("order", "2,1")) { + ok = true; + iterNext = std::next(iterNext); + } + } + if (ok && iterNext != steps.end()) { + ok = false; + auto &nextStep = *iterNext; + if (nextStep.name == "unitconvert" && + nextStep.paramValues.size() == 2 && + nextStep.paramValues[0].equals("xy_in", "deg") && + nextStep.paramValues[1].equals("xy_out", "rad")) { + ok = true; + iterNext = std::next(iterNext); + } + } + auto iterVgridshift = iterNext; + if (ok && iterNext != steps.end()) { + ok = false; + auto &nextStep = *iterNext; + if (nextStep.name == "vgridshift") { + ok = true; + iterNext = std::next(iterNext); + } + } + if (ok && iterNext != steps.end()) { + ok = false; + auto &nextStep = *iterNext; + if (nextStep.name == "unitconvert" && + nextStep.paramValues.size() == 2 && + nextStep.paramValues[0].equals("xy_in", "rad") && + nextStep.paramValues[1].equals("xy_out", "deg")) { + ok = true; + iterNext = std::next(iterNext); + } + } + if (ok && iterNext != steps.end()) { + ok = false; + auto &nextStep = *iterNext; + if (nextStep.name == "axisswap" && + nextStep.paramValues.size() == 1 && + nextStep.paramValues[0].equals("order", "2,1")) { + ok = true; + iterNext = std::next(iterNext); + } + } + if (ok && iterNext != steps.end()) { + ok = false; + auto &nextStep = *iterNext; + if (nextStep.name == "pop" && + nextStep.paramValues.size() == 2 && + nextStep.paramValues[0].keyEquals("v_1") && + nextStep.paramValues[1].keyEquals("v_2")) { + ok = true; + } + } + if (ok) { + steps.erase(iterPrev, iterVgridshift); + steps.erase(iterNext, std::next(iterNext)); + iterPrev = std::prev(iterVgridshift); + iterCur = iterVgridshift; continue; } } @@ -9201,13 +9428,22 @@ PrimeMeridianNNPtr pm(buildPrimeMeridian(step)); PropertyMap grfMap; + const auto &nadgrids = getParamValue(step, "nadgrids"); + const auto &towgs84 = getParamValue(step, "towgs84"); + std::string datumNameSuffix; + if (!nadgrids.empty()) { + datumNameSuffix = " using nadgrids=" + nadgrids; + } else if (!towgs84.empty()) { + datumNameSuffix = " using towgs84=" + towgs84; + } + // It is arguable that we allow the prime meridian of a datum defined by // its name to be overridden, but this is found at least in a regression // test // of GDAL. So let's keep the ellipsoid part of the datum in that case and // use the specified prime meridian. const auto overridePmIfNeeded = - [&pm](const GeodeticReferenceFrameNNPtr &grf) { + [&pm, &datumNameSuffix](const GeodeticReferenceFrameNNPtr &grf) { if (pm->_isEquivalentTo(PrimeMeridian::GREENWICH.get())) { return grf; } else { @@ -9215,7 +9451,7 @@ PropertyMap().set(IdentifiedObject::NAME_KEY, "Unknown based on " + grf->ellipsoid()->nameStr() + - " ellipsoid"), + " ellipsoid" + datumNameSuffix), grf->ellipsoid(), grf->anchorDefinition(), pm); } }; @@ -9232,7 +9468,7 @@ Length(R), guessBodyName(R)); return GeodeticReferenceFrame::create( grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), + title.empty() ? "unknown" + datumNameSuffix : title), ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); } @@ -9281,21 +9517,23 @@ } else if (!ellpsStr.empty()) { - auto l_datum = [&ellpsStr, &title, &grfMap, &optionalEmptyString, - &pm]() { + auto l_datum = [&ellpsStr, &title, &grfMap, &optionalEmptyString, &pm, + &datumNameSuffix]() { if (ellpsStr == "WGS84") { return GeodeticReferenceFrame::create( grfMap.set(IdentifiedObject::NAME_KEY, title.empty() - ? "Unknown based on WGS84 ellipsoid" - : title.c_str()), + ? "Unknown based on WGS84 ellipsoid" + + datumNameSuffix + : title), Ellipsoid::WGS84, optionalEmptyString, pm); } else if (ellpsStr == "GRS80") { return GeodeticReferenceFrame::create( grfMap.set(IdentifiedObject::NAME_KEY, title.empty() - ? "Unknown based on GRS80 ellipsoid" - : title.c_str()), + ? "Unknown based on GRS80 ellipsoid" + + datumNameSuffix + : title), Ellipsoid::GRS1980, optionalEmptyString, pm); } else { auto proj_ellps = proj_list_ellps(); @@ -9331,7 +9569,7 @@ title.empty() ? std::string("Unknown based on ") + proj_ellps[i].name + - " ellipsoid" + " ellipsoid" + datumNameSuffix : title), NN_NO_CHECK(ellipsoid), optionalEmptyString, pm); } @@ -9358,6 +9596,15 @@ } } + const auto createGRF = [&grfMap, &title, &optionalEmptyString, + &datumNameSuffix, + &pm](const EllipsoidNNPtr &ellipsoid) { + return GeodeticReferenceFrame::create( + grfMap.set(IdentifiedObject::NAME_KEY, + title.empty() ? "unknown" + datumNameSuffix : title), + ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + }; + if (a > 0 && (b > 0 || !bStr.empty())) { if (!bStr.empty()) { try { @@ -9370,10 +9617,7 @@ Ellipsoid::createTwoAxis(createMapWithUnknownName(), Length(a), Length(b), guessBodyName(a)) ->identify(); - return GeodeticReferenceFrame::create( - grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), - ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + return createGRF(ellipsoid); } else if (a > 0 && (rf >= 0 || !rfStr.empty())) { @@ -9388,10 +9632,7 @@ createMapWithUnknownName(), Length(a), Scale(rf), guessBodyName(a)) ->identify(); - return GeodeticReferenceFrame::create( - grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), - ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + return createGRF(ellipsoid); } else if (a > 0 && !fStr.empty()) { @@ -9405,10 +9646,7 @@ createMapWithUnknownName(), Length(a), Scale(f != 0.0 ? 1.0 / f : 0.0), guessBodyName(a)) ->identify(); - return GeodeticReferenceFrame::create( - grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), - ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + return createGRF(ellipsoid); } else if (a > 0 && !eStr.empty()) { @@ -9424,10 +9662,7 @@ createMapWithUnknownName(), Length(a), Scale(f != 0.0 ? 1.0 / f : 0.0), guessBodyName(a)) ->identify(); - return GeodeticReferenceFrame::create( - grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), - ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + return createGRF(ellipsoid); } else if (a > 0 && !esStr.empty()) { @@ -9442,10 +9677,7 @@ createMapWithUnknownName(), Length(a), Scale(f != 0.0 ? 1.0 / f : 0.0), guessBodyName(a)) ->identify(); - return GeodeticReferenceFrame::create( - grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), - ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + return createGRF(ellipsoid); } // If only a is specified, create a sphere @@ -9453,10 +9685,7 @@ esStr.empty()) { auto ellipsoid = Ellipsoid::createSphere(createMapWithUnknownName(), Length(a), guessBodyName(a)); - return GeodeticReferenceFrame::create( - grfMap.set(IdentifiedObject::NAME_KEY, - title.empty() ? "unknown" : title.c_str()), - ellipsoid, optionalEmptyString, fixupPrimeMeridan(ellipsoid, pm)); + return createGRF(ellipsoid); } if (!bStr.empty() && aStr.empty()) { @@ -9834,8 +10063,9 @@ const auto &geoidgrids = getParamValue(step, "geoidgrids"); if (!geoidgrids.empty()) { - auto vdatum = - VerticalReferenceFrame::create(createMapWithUnknownName()); + auto vdatum = VerticalReferenceFrame::create( + PropertyMap().set(common::IdentifiedObject::NAME_KEY, + "unknown using geoidgrids=" + geoidgrids)); const UnitOfMeasure unit = buildUnit(step, "vunits", "vto_meter"); diff -Nru proj-9.0.0/src/iso19111/metadata.cpp proj-9.0.1/src/iso19111/metadata.cpp --- proj-9.0.0/src/iso19111/metadata.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/metadata.cpp 2022-06-07 18:31:42.000000000 +0000 @@ -1243,14 +1243,14 @@ size_t j = 0; char lastValidA = 0; char lastValidB = 0; - while (a[i] != 0 && b[j] != 0) { + while (a[i] != 0 || b[j] != 0) { char aCh = a[i]; char bCh = b[j]; - if (aCh == ' ' && a[i + 1] == '+' && a[i + 2] == ' ') { + if (aCh == ' ' && a[i + 1] == '+' && a[i + 2] == ' ' && a[i + 3] != 0) { i += 3; continue; } - if (bCh == ' ' && b[j + 1] == '+' && b[j + 2] == ' ') { + if (bCh == ' ' && b[j + 1] == '+' && b[j + 2] == ' ' && b[j + 3] != 0) { j += 3; continue; } @@ -1288,21 +1288,18 @@ j += strlen(replacement->utf8) - 1; } } - if (::tolower(aCh) != ::tolower(bCh)) { + if ((aCh == 0 && bCh != 0) || (aCh != 0 && bCh == 0) || + ::tolower(aCh) != ::tolower(bCh)) { return false; } lastValidA = aCh; lastValidB = bCh; - ++i; - ++j; - } - while (a[i] != 0 && isIgnoredChar(a[i])) { - ++i; - } - while (b[j] != 0 && isIgnoredChar(b[j])) { - ++j; + if (aCh != 0) + ++i; + if (bCh != 0) + ++j; } - return a[i] == b[j]; + return true; } // --------------------------------------------------------------------------- diff -Nru proj-9.0.0/src/iso19111/operation/concatenatedoperation.cpp proj-9.0.1/src/iso19111/operation/concatenatedoperation.cpp --- proj-9.0.0/src/iso19111/operation/concatenatedoperation.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/operation/concatenatedoperation.cpp 2022-06-07 18:31:42.000000000 +0000 @@ -203,13 +203,30 @@ } lastTargetCRS = l_targetCRS; } + + // When chaining VerticalCRS -> GeographicCRS -> VerticalCRS, use + // GeographicCRS as the interpolationCRS + const auto l_sourceCRS = NN_NO_CHECK(operationsIn[0]->sourceCRS()); + const auto l_targetCRS = NN_NO_CHECK(operationsIn.back()->targetCRS()); + if (operationsIn.size() == 2 && interpolationCRS == nullptr && + dynamic_cast(l_sourceCRS.get()) != nullptr && + dynamic_cast(l_targetCRS.get()) != nullptr) { + const auto geog1 = dynamic_cast( + operationsIn[0]->targetCRS().get()); + const auto geog2 = dynamic_cast( + operationsIn[1]->sourceCRS().get()); + if (geog1 != nullptr && geog2 != nullptr && + geog1->_isEquivalentTo(geog2, + util::IComparable::Criterion::EQUIVALENT)) { + interpolationCRS = operationsIn[0]->targetCRS(); + } + } + auto op = ConcatenatedOperation::nn_make_shared( operationsIn); op->assignSelf(op); op->setProperties(properties); - op->setCRSs(NN_NO_CHECK(operationsIn[0]->sourceCRS()), - NN_NO_CHECK(operationsIn.back()->targetCRS()), - interpolationCRS); + op->setCRSs(l_sourceCRS, l_targetCRS, interpolationCRS); op->setAccuracies(accuracies); #ifdef DEBUG_CONCATENATED_OPERATION { @@ -276,14 +293,28 @@ } } + const auto extractDerivedCRS = + [](const crs::CRS *crs) -> const crs::DerivedCRS * { + auto derivedCRS = dynamic_cast(crs); + if (derivedCRS) + return derivedCRS; + auto compoundCRS = dynamic_cast(crs); + if (compoundCRS) { + derivedCRS = dynamic_cast( + compoundCRS->componentReferenceSystems().front().get()); + if (derivedCRS) + return derivedCRS; + } + return nullptr; + }; + for (size_t i = 0; i < operationsInOut.size(); ++i) { auto &op = operationsInOut[i]; auto l_sourceCRS = op->sourceCRS(); auto l_targetCRS = op->targetCRS(); auto conv = dynamic_cast(op.get()); if (conv && i == 0 && !l_sourceCRS && !l_targetCRS) { - if (auto derivedCRS = dynamic_cast( - concatOpSourceCRS.get())) { + if (auto derivedCRS = extractDerivedCRS(concatOpSourceCRS.get())) { if (i + 1 < operationsInOut.size()) { // use the sourceCRS of the next operation as our target CRS l_targetCRS = operationsInOut[i + 1]->sourceCRS(); @@ -323,8 +354,7 @@ } } else if (conv && i + 1 == operationsInOut.size() && !l_sourceCRS && !l_targetCRS) { - auto derivedCRS = - dynamic_cast(concatOpTargetCRS.get()); + auto derivedCRS = extractDerivedCRS(concatOpTargetCRS.get()); if (derivedCRS) { if (i >= 1) { // use the sourceCRS of the previous operation as our source @@ -350,8 +380,7 @@ } else if (i >= 1) { l_sourceCRS = operationsInOut[i - 1]->targetCRS(); if (l_sourceCRS) { - derivedCRS = dynamic_cast( - l_sourceCRS.get()); + derivedCRS = extractDerivedCRS(l_sourceCRS.get()); if (derivedCRS && conv->isEquivalentTo( derivedCRS->derivingConversion().get(), diff -Nru proj-9.0.0/src/iso19111/operation/conversion.cpp proj-9.0.1/src/iso19111/operation/conversion.cpp --- proj-9.0.0/src/iso19111/operation/conversion.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/operation/conversion.cpp 2022-04-29 18:18:53.000000000 +0000 @@ -3568,6 +3568,11 @@ const auto &components = compound->componentReferenceSystems(); if (!components.empty()) { horiz = components.front().as_nullable(); + const auto boundCRS = + dynamic_cast(horiz.get()); + if (boundCRS) { + horiz = boundCRS->baseCRS().as_nullable(); + } } } @@ -3986,6 +3991,11 @@ compound->componentReferenceSystems(); if (!components.empty()) { horiz = components.front().get(); + const auto boundCRS = + dynamic_cast(horiz); + if (boundCRS) { + horiz = boundCRS->baseCRS().get(); + } } } @@ -4073,10 +4083,16 @@ const auto &components = compound->componentReferenceSystems(); if (!components.empty()) { horiz = components.front().get(); + const auto boundCRS = + dynamic_cast(horiz); + if (boundCRS) { + horiz = boundCRS->baseCRS().get(); + } } } - if (!bEllipsoidParametersDone) { + // horiz != nullptr: only to make clang static analyzer happy + if (!bEllipsoidParametersDone && horiz != nullptr) { auto targetGeodCRS = horiz->extractGeodeticCRS(); auto targetGeogCRS = std::dynamic_pointer_cast(targetGeodCRS); diff -Nru proj-9.0.0/src/iso19111/operation/coordinateoperationfactory.cpp proj-9.0.1/src/iso19111/operation/coordinateoperationfactory.cpp --- proj-9.0.0/src/iso19111/operation/coordinateoperationfactory.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/operation/coordinateoperationfactory.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -4924,6 +4924,41 @@ } return; } + + auto boundSrc = + dynamic_cast(componentsSrc[0].get()); + if (boundSrc) { + derivedHSrc = dynamic_cast( + boundSrc->baseCRS().get()); + if (derivedHSrc) { + std::vector intermComponents{ + crs::BoundCRS::create(derivedHSrc->baseCRS(), + boundSrc->hubCRS(), + boundSrc->transformation()), + componentsSrc[1]}; + auto properties = util::PropertyMap().set( + common::IdentifiedObject::NAME_KEY, + intermComponents[0]->nameStr() + " + " + + intermComponents[1]->nameStr()); + auto intermCompound = + crs::CompoundCRS::create(properties, intermComponents); + auto opsFirst = + createOperations(sourceCRS, intermCompound, context); + assert(!opsFirst.empty()); + auto opsLast = + createOperations(intermCompound, targetCRS, context); + for (const auto &opLast : opsLast) { + try { + res.emplace_back( + ConcatenatedOperation::createComputeMetadata( + {opsFirst.front(), opLast}, + disallowEmptyIntersection)); + } catch (const std::exception &) { + } + } + return; + } + } } std::vector horizTransforms; @@ -5084,6 +5119,28 @@ componentsSrc[0], NN_NO_CHECK(interpolationGeogCRS), context); + // e.g when doing COMPOUND_CRS[ + // NAD83(CRS)+TOWGS84[0,0,0], + // CGVD28 height + EXTENSION["PROJ4_GRIDS","HT2_0.gtx"] + // to NAD83(CRS) 3D + const auto boundSrc = + dynamic_cast(componentsSrc[0].get()); + if (boundSrc && + boundSrc->baseCRS()->isEquivalentTo( + targetCRS->demoteTo2D(std::string(), dbContext) + .get(), + util::IComparable::Criterion::EQUIVALENT) && + boundSrc->hubCRS()->isEquivalentTo( + interpolationGeogCRS + ->demoteTo2D(std::string(), dbContext) + .get(), + util::IComparable::Criterion::EQUIVALENT)) { + // Make sure to use the same horizontal transformation + // (likely a null shift) + interpToTargetOps = applyInverse(srcToInterpOps); + return; + } + // But do the interpolation CRS to targetCRS in 3D // to have proper ellipsoid height transformation. // We need to force the vertical axis of this 3D'ified @@ -5304,16 +5361,65 @@ // If we didn't find a non-ballpark transformation between // the 2 vertical CRS, then try through intermediate geographic CRS - // For example - // WGS 84 + EGM96 --> ETRS89 + Belfast height where - // there is a geoid model for EGM96 referenced to WGS 84 - // and a geoid model for Belfast height referenced to ETRS89 if (verticalTransforms.size() == 1 && verticalTransforms.front()->hasBallparkTransformation()) { const auto &authFactory = context.context->getAuthorityFactory(); auto dbContext = authFactory ? authFactory->databaseContext().as_nullable() : nullptr; + + const auto createWithIntermediateCRS = + [&sourceCRS, &targetCRS, &context, + &res](const crs::CRSNNPtr &intermCRS) { + const auto ops1 = + createOperations(sourceCRS, intermCRS, context); + const auto ops2 = + createOperations(intermCRS, targetCRS, context); + for (const auto &op1 : ops1) { + for (const auto &op2 : ops2) { + try { + res.emplace_back( + ConcatenatedOperation::createComputeMetadata( + {op1, op2}, disallowEmptyIntersection)); + } catch (const std::exception &) { + } + } + } + }; + + const auto boundSrcHorizontal = + dynamic_cast(componentsSrc[0].get()); + const auto boundDstHorizontal = + dynamic_cast(componentsDst[0].get()); + + // CompoundCRS[something_with_TOWGS84, ...] to CompoundCRS[WGS84, ...] + if (boundSrcHorizontal != nullptr && boundDstHorizontal == nullptr && + boundSrcHorizontal->hubCRS()->_isEquivalentTo( + componentsDst[0].get(), + util::IComparable::Criterion::EQUIVALENT)) { + createWithIntermediateCRS( + componentsDst[0]->promoteTo3D(std::string(), dbContext)); + if (!res.empty()) { + return; + } + } + // Inverse of above + else if (boundDstHorizontal != nullptr && + boundSrcHorizontal == nullptr && + boundDstHorizontal->hubCRS()->_isEquivalentTo( + componentsSrc[0].get(), + util::IComparable::Criterion::EQUIVALENT)) { + createWithIntermediateCRS( + componentsSrc[0]->promoteTo3D(std::string(), dbContext)); + if (!res.empty()) { + return; + } + } + + // Deal with situation like + // WGS 84 + EGM96 --> ETRS89 + Belfast height where + // there is a geoid model for EGM96 referenced to WGS 84 + // and a geoid model for Belfast height referenced to ETRS89 const auto intermGeogSrc = srcGeog->promoteTo3D(std::string(), dbContext); const bool intermGeogSrcIsSameAsIntermGeogDst = @@ -5348,14 +5454,17 @@ return false; }; - const bool hasNonTrivialSrcTransf = - !opsSrcToGeog.empty() && - (!opsSrcToGeog.front()->hasBallparkTransformation() || - hasKnownGrid(opsSrcToGeog.front())); + const auto hasNonTrivialTransf = + [&hasKnownGrid](const std::vector &ops) { + return !ops.empty() && + (!ops.front()->hasBallparkTransformation() || + hasKnownGrid(ops.front())); + }; + + const bool hasNonTrivialSrcTransf = hasNonTrivialTransf(opsSrcToGeog); const bool hasNonTrivialTargetTransf = - !opsGeogToTarget.empty() && - (!opsGeogToTarget.front()->hasBallparkTransformation() || - hasKnownGrid(opsGeogToTarget.front())); + hasNonTrivialTransf(opsGeogToTarget); + double bestAccuracy = -1; if (hasNonTrivialSrcTransf && hasNonTrivialTargetTransf) { const auto opsGeogSrcToGeogDst = createOperations(intermGeogSrc, intermGeogDst, context); @@ -5396,6 +5505,12 @@ op2, op3}, disallowEmptyIntersection)); + const double accuracy = getAccuracy(res.back()); + if (accuracy >= 0 && + (bestAccuracy < 0 || + accuracy < bestAccuracy)) { + bestAccuracy = accuracy; + } } catch (const std::exception &) { } } @@ -5404,6 +5519,91 @@ } } + const auto createOpsInTwoSteps = + [&res, + bestAccuracy](const std::vector &ops1, + const std::vector &ops2) { + std::vector res2; + double bestAccuracy2 = -1; + + // In first pass, exclude (horizontal) ballpark operations, but + // accept them in second pass. + for (int pass = 0; pass <= 1 && res2.empty(); pass++) { + for (const auto &op1 : ops1) { + if (pass == 0 && op1->hasBallparkTransformation()) { + // std::cerr << "excluded " << op1->nameStr() << + // std::endl; + continue; + } + if (op1->nameStr().find( + BALLPARK_VERTICAL_TRANSFORMATION) != + std::string::npos) { + continue; + } + for (const auto &op2 : ops2) { + if (pass == 0 && op2->hasBallparkTransformation()) { + // std::cerr << "excluded " << op2->nameStr() << + // std::endl; + continue; + } + if (op2->nameStr().find( + BALLPARK_VERTICAL_TRANSFORMATION) != + std::string::npos) { + continue; + } + try { + res2.emplace_back( + ConcatenatedOperation:: + createComputeMetadata( + {op1, op2}, + disallowEmptyIntersection)); + const double accuracy = + getAccuracy(res2.back()); + if (accuracy >= 0 && + (bestAccuracy2 < 0 || + accuracy < bestAccuracy2)) { + bestAccuracy2 = accuracy; + } + } catch (const std::exception &) { + } + } + } + } + + // Keep the results of this new attempt, if there are better + // than the previous ones + if (bestAccuracy2 >= 0 && + (bestAccuracy < 0 || bestAccuracy2 < bestAccuracy)) { + res = std::move(res2); + } + }; + + // If the promoted-to-3D source geographic CRS is not a known object, + // transformations from it to another 3D one may not be relevant, + // so try doing source -> geogDst 3D -> dest, if geogDst 3D is a known + // object + if (!srcGeog->identifiers().empty() && + intermGeogSrc->identifiers().empty() && + !intermGeogDst->identifiers().empty() && + hasNonTrivialTargetTransf) { + const auto opsSrcToIntermGeog = + createOperations(sourceCRS, intermGeogDst, context); + if (hasNonTrivialTransf(opsSrcToIntermGeog)) { + createOpsInTwoSteps(opsSrcToIntermGeog, opsGeogToTarget); + } + } + // Symetrical situation with the promoted-to-3D target geographic CRS + else if (!dstGeog->identifiers().empty() && + intermGeogDst->identifiers().empty() && + !intermGeogSrc->identifiers().empty() && + hasNonTrivialSrcTransf) { + const auto opsIntermGeogToDst = + createOperations(intermGeogSrc, targetCRS, context); + if (hasNonTrivialTransf(opsIntermGeogToDst)) { + createOpsInTwoSteps(opsSrcToGeog, opsIntermGeogToDst); + } + } + if (!res.empty()) { return; } @@ -5546,6 +5746,44 @@ } } } + + // e.g transforming from a Bound[something_not_WGS84_but_with_TOWGS84] + // to a CompoundCRS[WGS84, ...] + const auto srcBaseSingleCRS = + dynamic_cast(boundSrc->baseCRS().get()); + const auto srcGeogCRS = boundSrc->extractGeographicCRS(); + const auto boundSrcHubAsGeogCRS = + dynamic_cast(boundSrc->hubCRS().get()); + const auto comp0Geog = componentsDst[0]->extractGeographicCRS(); + if (srcBaseSingleCRS && + srcBaseSingleCRS->coordinateSystem()->axisList().size() == 3 && + srcGeogCRS && boundSrcHubAsGeogCRS && comp0Geog && + boundSrcHubAsGeogCRS->coordinateSystem()->axisList().size() == 3 && + !srcGeogCRS->datumNonNull(dbContext)->isEquivalentTo( + comp0Geog->datumNonNull(dbContext).get(), + util::IComparable::Criterion::EQUIVALENT) && + boundSrcHubAsGeogCRS && + boundSrcHubAsGeogCRS->datumNonNull(dbContext)->isEquivalentTo( + comp0Geog->datumNonNull(dbContext).get(), + util::IComparable::Criterion::EQUIVALENT)) { + const auto ops1 = + createOperations(sourceCRS, boundSrc->hubCRS(), context); + const auto ops2 = + createOperations(boundSrc->hubCRS(), targetCRS, context); + for (const auto &op1 : ops1) { + for (const auto &op2 : ops2) { + try { + res.emplace_back( + ConcatenatedOperation::createComputeMetadata( + {op1, op2}, disallowEmptyIntersection)); + } catch (const std::exception &) { + } + } + } + if (!res.empty()) { + return; + } + } } // There might be better things to do, but for now just ignore the diff -Nru proj-9.0.0/src/iso19111/operation/projbasedoperation.cpp proj-9.0.1/src/iso19111/operation/projbasedoperation.cpp --- proj-9.0.0/src/iso19111/operation/projbasedoperation.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/operation/projbasedoperation.cpp 2022-03-25 07:13:55.000000000 +0000 @@ -232,15 +232,13 @@ method()->_exportToJSON(formatter); const auto &l_parameterValues = parameterValues(); - if (!l_parameterValues.empty()) { - writer->AddObjKey("parameters"); - { - auto parametersContext(writer->MakeArrayContext(false)); - for (const auto &genOpParamvalue : l_parameterValues) { - formatter->setAllowIDInImmediateChild(); - formatter->setOmitTypeInImmediateChild(); - genOpParamvalue->_exportToJSON(formatter); - } + writer->AddObjKey("parameters"); + { + auto parametersContext(writer->MakeArrayContext(false)); + for (const auto &genOpParamvalue : l_parameterValues) { + formatter->setAllowIDInImmediateChild(); + formatter->setOmitTypeInImmediateChild(); + genOpParamvalue->_exportToJSON(formatter); } } } diff -Nru proj-9.0.0/src/iso19111/operation/singleoperation.cpp proj-9.0.1/src/iso19111/operation/singleoperation.cpp --- proj-9.0.0/src/iso19111/operation/singleoperation.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/operation/singleoperation.cpp 2022-04-29 18:18:53.000000000 +0000 @@ -2008,8 +2008,27 @@ paramValue->_exportToWKT(formatter, nullptr); } - if (!formatter->abridgedTransformation()) { - if (interpolationCRS()) { + const auto l_interpolactionCRS = interpolationCRS(); + if (formatter->abridgedTransformation()) { + // If we have an interpolation CRS that has a EPSG code, then + // we can export it as a PARAMETER[] + if (l_interpolactionCRS) { + const auto code = l_interpolactionCRS->getEPSGCode(); + if (code != 0) { + formatter->startNode(io::WKTConstants::PARAMETER, false); + formatter->addQuotedString( + EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS); + formatter->add(code); + formatter->startNode(io::WKTConstants::ID, false); + formatter->addQuotedString(metadata::Identifier::EPSG); + formatter->add( + EPSG_CODE_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS); + formatter->endNode(); + formatter->endNode(); + } + } + } else { + if (l_interpolactionCRS) { formatter->startNode(io::WKTConstants::INTERPOLATIONCRS, false); interpolationCRS()->_exportToWKT(formatter); formatter->endNode(); diff -Nru proj-9.0.0/src/iso19111/operation/transformation.cpp proj-9.0.1/src/iso19111/operation/transformation.cpp --- proj-9.0.0/src/iso19111/operation/transformation.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/iso19111/operation/transformation.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -1429,6 +1429,8 @@ metadata::Identifier::EPSG) .set(metadata::Identifier::CODE_KEY, method_epsg_code); } + bool exactInverse = + (neg_rx == 0 && neg_ry == 0 && neg_rz == 0 && neg_scaleDiff == 0); if (fifteenParamsTransform) { double neg_rate_x = negate(op->parameterValueNumeric( EPSG_CODE_PARAMETER_RATE_X_AXIS_TRANSLATION, @@ -1454,9 +1456,11 @@ double referenceEpochYear = op->parameterValueNumeric(EPSG_CODE_PARAMETER_REFERENCE_EPOCH, common::UnitOfMeasure::YEAR); + exactInverse &= (neg_rate_rx == 0 && neg_rate_ry == 0 && + neg_rate_rz == 0 && neg_rate_scaleDiff == 0); return util::nn_static_pointer_cast( createFifteenParamsTransform( - createPropertiesForInverse(op, false, true), + createPropertiesForInverse(op, false, !exactInverse), methodProperties, op->targetCRS(), op->sourceCRS(), neg_x, neg_y, neg_z, neg_rx, neg_ry, neg_rz, neg_scaleDiff, neg_rate_x, neg_rate_y, neg_rate_z, @@ -1467,7 +1471,7 @@ } else { return util::nn_static_pointer_cast( createSevenParamsTransform( - createPropertiesForInverse(op, false, true), + createPropertiesForInverse(op, false, !exactInverse), methodProperties, op->targetCRS(), op->sourceCRS(), neg_x, neg_y, neg_z, neg_rx, neg_ry, neg_rz, neg_scaleDiff, op->coordinateOperationAccuracies())) @@ -2184,6 +2188,7 @@ !NTv1Filename.empty() ? NTv1Filename : !NTv2Filename.empty() ? NTv2Filename : lasFilename; + const auto l_interpolationCRS = interpolationCRS(); if (!horizontalGridName.empty() && databaseContext->lookForGridAlternative( horizontalGridName, projFilename, @@ -2212,14 +2217,14 @@ if (inverseDirection) { return create(createPropertiesForInverse( self.as_nullable().get(), true, false), - l_targetCRS, l_sourceCRS, nullptr, + l_targetCRS, l_sourceCRS, l_interpolationCRS, methodProperties, parameters, values, l_accuracies) ->inverseAsTransformation(); } else { return create(createSimilarPropertiesTransformation(self), - l_sourceCRS, l_targetCRS, nullptr, + l_sourceCRS, l_targetCRS, l_interpolationCRS, methodProperties, parameters, values, l_accuracies); } @@ -2259,14 +2264,14 @@ if (inverseDirection) { return create(createPropertiesForInverse( self.as_nullable().get(), true, false), - l_targetCRS, l_sourceCRS, nullptr, + l_targetCRS, l_sourceCRS, l_interpolationCRS, methodProperties, parameters, values, l_accuracies) ->inverseAsTransformation(); } else { return create(createSimilarPropertiesTransformation(self), - l_sourceCRS, l_targetCRS, nullptr, + l_sourceCRS, l_targetCRS, l_interpolationCRS, methodProperties, parameters, values, l_accuracies); } @@ -2301,7 +2306,7 @@ return create( createPropertiesForInverse( self.as_nullable().get(), true, false), - targetCRS(), sourceCRS(), nullptr, + targetCRS(), sourceCRS(), l_interpolationCRS, createSimilarPropertiesMethod(method()), parameters, {ParameterValue::createFilename(projFilename)}, @@ -2312,7 +2317,7 @@ { return create( createSimilarPropertiesTransformation(self), - sourceCRS(), targetCRS(), nullptr, + sourceCRS(), targetCRS(), l_interpolationCRS, createSimilarPropertiesMethod(method()), parameters, {ParameterValue::createFilename(projFilename)}, coordinateOperationAccuracies()); @@ -2342,7 +2347,7 @@ std::vector{createOpParamNameEPSGCode( EPSG_CODE_PARAMETER_GEOCENTRIC_TRANSLATION_FILE)}; return create(createSimilarPropertiesTransformation(self), - sourceCRS(), targetCRS(), interpolationCRS(), + sourceCRS(), targetCRS(), l_interpolationCRS, createSimilarPropertiesMethod(method()), parameters, {ParameterValue::createFilename(projFilename)}, coordinateOperationAccuracies()); @@ -2380,7 +2385,7 @@ return create( createPropertiesForInverse( self.as_nullable().get(), true, false), - targetCRS(), sourceCRS(), nullptr, + targetCRS(), sourceCRS(), l_interpolationCRS, createSimilarPropertiesMethod(method()), parameters, {ParameterValue::createFilename(projFilename)}, @@ -2389,7 +2394,7 @@ } else { return create( createSimilarPropertiesTransformation(self), - sourceCRS(), targetCRS(), nullptr, + sourceCRS(), targetCRS(), l_interpolationCRS, createSimilarPropertiesMethod(method()), parameters, {ParameterValue::createFilename(projFilename)}, coordinateOperationAccuracies()); diff -Nru proj-9.0.0/src/lib_proj.cmake proj-9.0.1/src/lib_proj.cmake --- proj-9.0.0/src/lib_proj.cmake 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/lib_proj.cmake 2022-06-08 15:59:53.000000000 +0000 @@ -333,7 +333,7 @@ COMMAND ${CMAKE_COMMAND} "-DIN_FILE=wkt2_grammar.y" "-DTARGET=generate_wkt2_parser" - "-DEXPECTED_MD5SUM=1691b7d213073d5a1b49db2e080bc96e" + "-DEXPECTED_MD5SUM=35a7bcbe193edb11926e4a48e6e45702" -P "${CMAKE_CURRENT_SOURCE_DIR}/check_md5sum.cmake" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/wkt2_grammar.y" @@ -461,10 +461,10 @@ if(CURL_ENABLED) target_compile_definitions(proj PRIVATE -DCURL_ENABLED) - target_include_directories(proj PRIVATE ${CURL_INCLUDE_DIR}) + target_include_directories(proj PRIVATE ${CURL_INCLUDE_DIRS}) target_link_libraries(proj PRIVATE - ${CURL_LIBRARY} + ${CURL_LIBRARIES} $<$:ws2_32> $<$:wldap32> $<$:advapi32> diff -Nru proj-9.0.0/src/pipeline.cpp proj-9.0.1/src/pipeline.cpp --- proj-9.0.0/src/pipeline.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/pipeline.cpp 2022-04-29 18:18:53.000000000 +0000 @@ -550,7 +550,7 @@ /* determine if an inverse operation is possible */ for( auto& step: pipeline->steps) { PJ *Q = step.pj; - if ( pj_has_inverse(Q) ) { + if ( step.omit_inv || pj_has_inverse(Q) ) { continue; } else { P->inv = nullptr; diff -Nru proj-9.0.0/src/proj_constants.h proj-9.0.1/src/proj_constants.h --- proj-9.0.0/src/proj_constants.h 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/proj_constants.h 2022-06-08 15:59:53.000000000 +0000 @@ -555,6 +555,10 @@ #define EPSG_NAME_PARAMETER_GEOCENTRIC_TRANSLATION_FILE \ "Geocentric translation file" +#define EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS \ + "EPSG code for Interpolation CRS" +#define EPSG_CODE_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS 1048 + /* ------------------------------------------------------------------------ */ #define PROJ_WKT2_NAME_METHOD_HEIGHT_TO_GEOG3D \ diff -Nru proj-9.0.0/src/projections/moll.cpp proj-9.0.1/src/projections/moll.cpp --- proj-9.0.0/src/projections/moll.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/projections/moll.cpp 2022-03-25 07:13:55.000000000 +0000 @@ -10,7 +10,7 @@ PROJ_HEAD(wag4, "Wagner IV") "\n\tPCyl, Sph"; PROJ_HEAD(wag5, "Wagner V") "\n\tPCyl, Sph"; -#define MAX_ITER 10 +#define MAX_ITER 30 #define LOOP_TOL 1e-7 namespace { // anonymous namespace diff -Nru proj-9.0.0/src/proj.h proj-9.0.1/src/proj.h --- proj-9.0.0/src/proj.h 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/proj.h 2022-06-08 15:59:53.000000000 +0000 @@ -174,7 +174,7 @@ /* The version numbers should be updated with every release! **/ #define PROJ_VERSION_MAJOR 9 #define PROJ_VERSION_MINOR 0 -#define PROJ_VERSION_PATCH 0 +#define PROJ_VERSION_PATCH 1 /* Note: the following 3 defines have been introduced in PROJ 8.0.1 */ /* Macro to compute a PROJ version number from its components */ @@ -379,12 +379,12 @@ /** Callback to resolve a filename to a full path */ typedef const char* (*proj_file_finder) (PJ_CONTEXT *ctx, const char*, void* user_data); +/*! @endcond */ void PROJ_DLL proj_context_set_file_finder(PJ_CONTEXT *ctx, proj_file_finder finder, void* user_data); -/*! @endcond */ void PROJ_DLL proj_context_set_search_paths(PJ_CONTEXT *ctx, int count_paths, const char* const* paths); -/*! @cond Doxygen_Suppress */ void PROJ_DLL proj_context_set_ca_bundle_path(PJ_CONTEXT *ctx, const char *path); +/*! @cond Doxygen_Suppress */ void PROJ_DLL proj_context_use_proj4_init_rules(PJ_CONTEXT *ctx, int enable); int PROJ_DLL proj_context_get_use_proj4_init_rules(PJ_CONTEXT *ctx, int from_legacy_code_path); diff -Nru proj-9.0.0/src/release.cpp proj-9.0.1/src/release.cpp --- proj-9.0.0/src/release.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/release.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -11,7 +11,7 @@ STR(PROJ_VERSION_MAJOR)"." STR(PROJ_VERSION_MINOR)"." STR(PROJ_VERSION_PATCH)", " - "March 1st, 2022"; + "June 15th, 2022"; const char *pj_get_release() { return pj_release; diff -Nru proj-9.0.0/src/wkt2_generated_parser.c proj-9.0.1/src/wkt2_generated_parser.c --- proj-9.0.0/src/wkt2_generated_parser.c 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/wkt2_generated_parser.c 2022-04-29 18:18:53.000000000 +0000 @@ -134,8 +134,8 @@ /* Use api.header.include to #include this header instead of duplicating it here. */ -#ifndef YY_PJ_WKT2_SRC_WKT2_GENERATED_PARSER_H_INCLUDED -# define YY_PJ_WKT2_SRC_WKT2_GENERATED_PARSER_H_INCLUDED +#ifndef YY_PJ_WKT2_WKT2_GENERATED_PARSER_H_INCLUDED +# define YY_PJ_WKT2_WKT2_GENERATED_PARSER_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -295,7 +295,8 @@ T_PAST = 400, T_UNSPECIFIED = 401, T_STRING = 402, - T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE = 403 + T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE = 403, + T_EPSG_CODE_FOR_INTERPOLATION = 404 }; #endif @@ -310,7 +311,7 @@ int pj_wkt2_parse (pj_wkt2_parse_context *context); -#endif /* !YY_PJ_WKT2_SRC_WKT2_GENERATED_PARSER_H_INCLUDED */ +#endif /* !YY_PJ_WKT2_WKT2_GENERATED_PARSER_H_INCLUDED */ @@ -616,19 +617,19 @@ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 106 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2959 +#define YYLAST 3025 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 164 +#define YYNTOKENS 165 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 352 +#define YYNNTS 354 /* YYNRULES -- Number of rules. */ -#define YYNRULES 693 +#define YYNRULES 698 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1425 +#define YYNSTATES 1438 #define YYUNDEFTOK 2 -#define YYMAXUTOK 403 +#define YYMAXUTOK 404 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -644,12 +645,12 @@ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 160, 162, 2, 154, 163, 155, 149, 2, 2, 151, - 152, 153, 2, 2, 2, 2, 2, 2, 156, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 150, + 161, 163, 2, 155, 164, 156, 150, 2, 2, 152, + 153, 154, 2, 2, 2, 2, 2, 2, 157, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 151, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 157, 2, 2, 2, 2, 2, - 158, 159, 2, 161, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 158, 2, 2, 2, 2, 2, + 159, 160, 2, 162, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -680,83 +681,83 @@ 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148 + 145, 146, 147, 148, 149 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 207, 207, 207, 207, 207, 207, 207, 208, 208, - 208, 209, 212, 212, 213, 213, 213, 214, 216, 216, - 220, 224, 224, 226, 228, 230, 230, 232, 232, 234, - 236, 238, 240, 242, 242, 244, 244, 246, 246, 246, - 246, 248, 248, 252, 254, 258, 259, 260, 262, 262, - 264, 266, 268, 270, 274, 275, 278, 279, 281, 283, - 285, 288, 289, 290, 292, 294, 296, 296, 298, 301, - 302, 304, 304, 309, 309, 311, 311, 313, 315, 317, - 321, 322, 325, 326, 327, 329, 329, 330, 333, 334, - 338, 339, 340, 344, 345, 346, 347, 349, 353, 355, - 358, 360, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 398, 400, 402, 406, 411, 413, 415, 417, - 419, 423, 428, 429, 431, 433, 435, 439, 443, 445, - 445, 447, 447, 452, 457, 458, 459, 460, 461, 462, - 463, 465, 467, 469, 469, 471, 471, 473, 475, 477, - 479, 481, 483, 487, 489, 493, 493, 496, 499, 504, - 504, 504, 504, 504, 507, 512, 512, 512, 512, 515, - 519, 520, 522, 538, 542, 543, 545, 545, 547, 547, - 553, 553, 555, 557, 564, 564, 564, 564, 566, 573, - 574, 575, 576, 578, 585, 586, 587, 588, 590, 597, - 604, 605, 606, 608, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 612, 612, 614, 614, 616, 616, 616, - 618, 623, 629, 634, 637, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 651, 652, 653, 654, 655, 656, - 657, 658, 661, 662, 663, 664, 665, 666, 667, 668, - 671, 672, 675, 676, 677, 678, 683, 684, 685, 686, - 687, 688, 689, 690, 691, 694, 695, 696, 697, 700, - 701, 702, 703, 706, 707, 710, 711, 716, 717, 720, - 721, 722, 723, 726, 727, 728, 729, 730, 731, 732, - 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, - 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, 761, 763, - 766, 768, 770, 772, 774, 776, 792, 792, 794, 802, - 803, 805, 806, 808, 816, 817, 819, 821, 823, 828, - 829, 831, 833, 835, 837, 839, 841, 843, 848, 852, - 854, 857, 860, 861, 862, 864, 865, 867, 872, 873, - 875, 875, 877, 881, 881, 881, 883, 883, 885, 893, - 902, 910, 920, 921, 923, 925, 925, 927, 927, 930, - 931, 935, 941, 942, 943, 945, 945, 947, 949, 951, - 955, 960, 960, 962, 965, 966, 971, 972, 974, 979, - 979, 979, 981, 983, 984, 985, 986, 988, 991, 993, - 997, 1003, 1003, 1007, 1007, 1008, 1008, 1010, 1015, 1016, - 1017, 1018, 1019, 1021, 1027, 1032, 1038, 1040, 1042, 1044, - 1048, 1054, 1055, 1056, 1058, 1060, 1062, 1066, 1066, 1068, - 1070, 1075, 1076, 1077, 1079, 1081, 1083, 1085, 1089, 1089, - 1091, 1097, 1104, 1104, 1107, 1114, 1115, 1116, 1117, 1118, - 1120, 1124, 1126, 1128, 1128, 1132, 1137, 1137, 1137, 1141, - 1146, 1146, 1148, 1152, 1152, 1156, 1161, 1163, 1167, 1167, - 1171, 1176, 1178, 1182, 1183, 1184, 1185, 1186, 1188, 1188, - 1190, 1193, 1195, 1195, 1197, 1199, 1201, 1205, 1211, 1212, - 1213, 1214, 1216, 1218, 1222, 1227, 1229, 1232, 1237, 1241, - 1247, 1247, 1247, 1247, 1247, 1247, 1251, 1256, 1258, 1263, - 1263, 1264, 1266, 1266, 1268, 1275, 1275, 1277, 1284, 1284, - 1286, 1293, 1300, 1305, 1306, 1307, 1309, 1315, 1320, 1328, - 1334, 1336, 1338, 1344, 1346, 1346, 1347, 1347, 1351, 1357, - 1357, 1359, 1364, 1370, 1375, 1381, 1386, 1391, 1397, 1402, - 1407, 1413, 1418, 1423, 1429, 1429, 1430, 1430, 1431, 1431, - 1432, 1432, 1433, 1433, 1434, 1434, 1437, 1437, 1439, 1440, - 1441, 1443, 1445, 1449, 1452, 1452, 1455, 1456, 1457, 1459, - 1463, 1464, 1466, 1468, 1468, 1469, 1469, 1470, 1470, 1470, - 1471, 1472, 1472, 1473, 1473, 1474, 1474, 1476, 1476, 1477, - 1477, 1478, 1479, 1479, 1483, 1487, 1488, 1491, 1496, 1497, - 1498, 1499, 1500, 1501, 1502, 1504, 1506, 1508, 1511, 1513, - 1515, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1534, 1538, - 1539, 1542, 1547, 1548, 1549, 1550, 1551, 1553, 1558, 1563, - 1564, 1567, 1573, 1573, 1573, 1573, 1575, 1576, 1577, 1578, - 1580, 1582, 1587, 1593, 1595, 1600, 1601, 1604, 1612, 1613, - 1614, 1615, 1617, 1619 + 0, 209, 209, 209, 209, 209, 209, 209, 210, 210, + 210, 211, 214, 214, 215, 215, 215, 216, 218, 218, + 222, 226, 226, 228, 230, 232, 232, 234, 234, 236, + 238, 240, 242, 244, 244, 246, 246, 248, 248, 248, + 248, 250, 250, 254, 256, 260, 261, 262, 264, 264, + 266, 268, 270, 272, 276, 277, 280, 281, 283, 285, + 287, 290, 291, 292, 294, 296, 298, 298, 300, 303, + 304, 306, 306, 311, 311, 313, 313, 315, 317, 319, + 323, 324, 327, 328, 329, 331, 331, 332, 335, 336, + 340, 341, 342, 346, 347, 348, 349, 351, 355, 357, + 360, 362, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 400, 402, 404, 408, 413, 415, 417, 419, + 421, 425, 430, 431, 433, 435, 437, 441, 445, 447, + 447, 449, 449, 454, 459, 460, 461, 462, 463, 464, + 465, 467, 469, 471, 471, 473, 473, 475, 477, 479, + 481, 483, 485, 489, 491, 495, 495, 498, 501, 506, + 506, 506, 506, 506, 509, 514, 514, 514, 514, 517, + 521, 522, 524, 540, 544, 545, 547, 547, 549, 549, + 555, 555, 557, 559, 566, 566, 566, 566, 568, 575, + 576, 577, 578, 580, 587, 588, 589, 590, 592, 599, + 606, 607, 608, 610, 612, 612, 612, 612, 612, 612, + 612, 612, 612, 614, 614, 616, 616, 618, 618, 618, + 620, 625, 631, 636, 639, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 653, 654, 655, 656, 657, 658, + 659, 660, 663, 664, 665, 666, 667, 668, 669, 670, + 673, 674, 677, 678, 679, 680, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 696, 697, 698, 699, 702, + 703, 704, 705, 708, 709, 712, 713, 718, 719, 722, + 723, 724, 725, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + 755, 756, 757, 758, 759, 760, 761, 762, 763, 765, + 768, 770, 772, 774, 776, 778, 794, 794, 796, 804, + 805, 807, 808, 810, 818, 819, 821, 823, 825, 830, + 831, 833, 835, 837, 839, 841, 843, 845, 850, 854, + 856, 859, 862, 863, 864, 866, 867, 869, 874, 875, + 877, 877, 879, 883, 883, 883, 885, 885, 887, 895, + 904, 912, 922, 923, 925, 927, 927, 929, 929, 932, + 933, 937, 943, 944, 945, 947, 947, 949, 951, 953, + 957, 962, 962, 964, 967, 968, 973, 974, 976, 981, + 981, 981, 983, 985, 986, 987, 988, 990, 993, 995, + 999, 1005, 1005, 1009, 1009, 1010, 1010, 1012, 1017, 1018, + 1019, 1020, 1021, 1023, 1029, 1034, 1040, 1042, 1044, 1046, + 1050, 1056, 1057, 1058, 1060, 1062, 1064, 1068, 1068, 1070, + 1072, 1077, 1078, 1079, 1081, 1083, 1085, 1087, 1091, 1091, + 1093, 1099, 1106, 1106, 1109, 1116, 1117, 1118, 1119, 1120, + 1122, 1126, 1128, 1130, 1130, 1134, 1139, 1139, 1139, 1143, + 1148, 1148, 1150, 1154, 1154, 1158, 1163, 1165, 1169, 1169, + 1173, 1178, 1180, 1184, 1185, 1186, 1187, 1188, 1190, 1190, + 1192, 1195, 1197, 1197, 1199, 1201, 1203, 1207, 1213, 1214, + 1215, 1216, 1218, 1220, 1224, 1229, 1231, 1234, 1241, 1242, + 1243, 1245, 1249, 1255, 1255, 1255, 1255, 1255, 1255, 1259, + 1264, 1266, 1271, 1271, 1272, 1274, 1274, 1276, 1283, 1283, + 1285, 1292, 1292, 1294, 1301, 1308, 1313, 1314, 1315, 1317, + 1323, 1328, 1336, 1342, 1344, 1346, 1352, 1354, 1354, 1355, + 1355, 1359, 1365, 1365, 1367, 1372, 1378, 1383, 1389, 1394, + 1399, 1405, 1410, 1415, 1421, 1426, 1431, 1437, 1437, 1438, + 1438, 1439, 1439, 1440, 1440, 1441, 1441, 1442, 1442, 1445, + 1445, 1447, 1448, 1449, 1451, 1453, 1457, 1460, 1460, 1463, + 1464, 1465, 1467, 1471, 1472, 1474, 1476, 1476, 1477, 1477, + 1478, 1478, 1478, 1479, 1480, 1480, 1481, 1481, 1482, 1482, + 1484, 1484, 1485, 1485, 1486, 1487, 1487, 1491, 1495, 1496, + 1499, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1512, 1514, + 1516, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, + 1537, 1542, 1546, 1547, 1550, 1555, 1556, 1557, 1558, 1559, + 1561, 1566, 1571, 1572, 1575, 1581, 1581, 1581, 1581, 1583, + 1584, 1585, 1586, 1588, 1590, 1595, 1601, 1603, 1608, 1609, + 1612, 1620, 1621, 1622, 1623, 1625, 1627, 1632, 1633 }; #endif @@ -804,15 +805,15 @@ "\"aft\"", "\"port\"", "\"starboard\"", "\"clockwise\"", "\"counterClockwise\"", "\"towards\"", "\"awayFrom\"", "\"future\"", "\"part\"", "\"unspecified\"", "\"string\"", "\"unsigned integer\"", - "'.'", "'E'", "'1'", "'2'", "'3'", "'+'", "'-'", "':'", "'T'", "'Z'", - "'['", "'('", "']'", "')'", "','", "$accept", "input", "datum", "crs", - "period", "number", "signed_numeric_literal_with_sign", - "signed_numeric_literal", "unsigned_numeric_literal", "opt_sign", - "approximate_numeric_literal", "mantissa", "exponent", "signed_integer", - "exact_numeric_literal", "opt_period_unsigned_integer", - "unsigned_integer", "sign", "colon", "hyphen", "datetime", - "opt_24_hour_clock", "year", "month", "day", "_24_hour_clock", - "opt_colon_minute_colon_second_time_zone_designator", + "\"EPSG code for interpolation CRS\"", "'.'", "'E'", "'1'", "'2'", "'3'", + "'+'", "'-'", "':'", "'T'", "'Z'", "'['", "'('", "']'", "')'", "','", + "$accept", "input", "datum", "crs", "period", "number", + "signed_numeric_literal_with_sign", "signed_numeric_literal", + "unsigned_numeric_literal", "opt_sign", "approximate_numeric_literal", + "mantissa", "exponent", "signed_integer", "exact_numeric_literal", + "opt_period_unsigned_integer", "unsigned_integer", "sign", "colon", + "hyphen", "datetime", "opt_24_hour_clock", "year", "month", "day", + "_24_hour_clock", "opt_colon_minute_colon_second_time_zone_designator", "opt_colon_second_time_zone_designator", "time_designator", "hour", "minute", "second_time_zone_designator", "seconds_integer", "seconds_fraction", "time_zone_designator", "utc_designator", @@ -928,7 +929,7 @@ "opt_separator_parameter_or_parameter_file_identifier_list", "deriving_conversion_keyword", "deriving_conversion_name", "operation_method", "operation_method_keyword", "operation_method_name", - "operation_parameter", "parameter_unit", + "operation_parameter", "operation_parameter_body", "parameter_unit", "length_or_angle_or_scale_or_time_or_parametric_unit", "length_or_angle_or_scale_or_time_or_parametric_unit_keyword", "operation_parameter_file", "parameter_file_keyword", @@ -973,7 +974,8 @@ "abridged_coordinate_transformation_next", "abridged_coordinate_transformation_end", "opt_end_abridged_coordinate_transformation", - "abridged_transformation_keyword", "abridged_transformation_parameter", YY_NULLPTR + "abridged_transformation_keyword", "abridged_transformation_parameter", + "abridged_transformation_parameter_body", YY_NULLPTR }; #endif @@ -996,18 +998,18 @@ 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 46, - 69, 49, 50, 51, 43, 45, 58, 84, 90, 91, - 40, 93, 41, 44 + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 46, 69, 49, 50, 51, 43, 45, 58, 84, 90, + 91, 40, 93, 41, 44 }; # endif -#define YYPACT_NINF (-1212) +#define YYPACT_NINF (-1247) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-634) +#define YYTABLE_NINF (-637) #define yytable_value_is_error(Yyn) \ 0 @@ -1016,149 +1018,150 @@ STATE-NUM. */ static const yytype_int16 yypact[] = { - 1339, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, 94, -1212, -1212, - -1212, -106, -1212, -1212, -1212, -106, -1212, -1212, -1212, -1212, - -1212, -1212, -106, -106, -1212, -106, -1212, -14, -106, -1212, - -106, -1212, -106, -1212, -1212, -1212, -106, -1212, -106, -1212, - -106, -1212, -106, -1212, -106, -1212, -106, -1212, -106, -1212, - -106, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -106, -1212, - -1212, -1212, -1212, -1212, -1212, -106, -1212, -106, -1212, -106, - -1212, -106, -1212, -106, -1212, -106, -1212, -1212, -1212, -35, - -35, -35, -35, -35, -1212, 55, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, 1609, - -35, -35, -35, 121, -1212, -1212, -14, -1212, -14, -1212, - -14, -14, -1212, -14, -1212, -1212, -1212, -106, -1212, -14, - -14, -1212, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -1212, -14, -1212, -14, -1212, -1212, -1212, -1212, 9, - -1212, -1212, -1212, -1212, -1212, 16, 29, 75, -1212, -1212, - -1212, -1212, 439, -1212, -14, -1212, -14, -14, -14, -1212, - -14, -106, 1370, 193, 122, 122, 781, -35, 137, 364, - 150, 519, 428, 439, 358, 439, 287, 439, 85, 241, - 439, 235, 1635, -1212, -1212, -1212, 191, 99, -1212, -1212, - 99, -1212, -1212, 99, -1212, -1212, 285, 1609, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, 491, -1212, -1212, -1212, -1212, - 202, 219, 275, 781, -1212, -14, -1212, -14, -106, -1212, - -1212, -1212, -1212, -106, -14, -106, -14, -1212, -106, -106, - -14, -14, -1212, -1212, -1212, -1212, -14, -14, -14, -14, - -1212, -14, -1212, -14, -14, -14, -1212, -1212, -1212, -1212, - -106, -106, -1212, -1212, -14, -106, -1212, -1212, -106, -14, - -14, -1212, -14, -1212, -1212, -106, -1212, -14, -14, -106, - -1212, -1212, -14, -14, -106, -1212, -1212, -14, -14, -106, - -1212, -1212, -14, -14, -106, -1212, -1212, -14, -14, -106, - -14, -106, -1212, -1212, -14, -106, -1212, -14, -1212, -1212, - -1212, -1212, -106, -1212, -14, -106, -14, -14, -14, -14, - -14, -1212, -14, -106, 439, -1212, 371, 491, -1212, -1212, - 163, 439, 283, 439, 439, -35, -35, 56, 357, 258, - -35, -35, 408, 408, 56, 258, 408, 408, 781, 371, - 439, 457, -35, -35, 316, 439, -35, -35, 82, 447, - 408, -35, 476, -1212, 476, -35, 447, 408, -35, 447, - 408, -35, 447, 408, -35, -1212, -1212, 586, 256, -1212, - -35, 408, -35, 1635, 491, 121, -1212, -35, 285, 121, - -1212, 504, 121, -1212, 285, 495, 1609, -1212, 491, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, -14, -14, -106, - -1212, -106, -1212, -1212, -14, -14, -106, -14, -1212, -1212, - -1212, -14, -14, -14, -1212, -14, -106, -1212, -1212, -1212, - -1212, -1212, -1212, -106, 439, -14, -1212, -14, -14, -1212, - -14, -106, -14, -14, 439, -14, -14, -1212, -14, -14, - 781, 439, -1212, -14, -14, -14, -1212, -14, -14, -106, - -1212, -1212, -14, -14, -14, -106, 439, -14, -14, -14, - -14, -1212, 439, 439, -14, -14, 439, -14, -14, 439, - -14, -14, -1212, -1212, 182, -1212, 439, -14, -1212, 439, - -14, -14, -14, 275, 439, -1212, 439, -14, -1212, -14, - -106, -14, -1212, -14, -106, 439, -1212, 500, 518, -35, - -35, -1212, -1212, 476, -1212, 1081, 502, 476, 439, 193, - 258, 545, 439, 491, 1651, -1212, 447, 107, 107, 447, - -35, 447, 258, -1212, 447, 447, 435, 439, 475, -1212, - -1212, -1212, 447, 107, 107, -1212, -1212, -35, 439, 193, - 447, 1611, -1212, 447, 393, -1212, -1212, -1212, -1212, 447, - 197, -1212, 447, 299, -1212, 447, 95, -1212, -1212, 491, - -1212, -1212, 491, -1212, -1212, -1212, 447, 364, 1549, 439, - 491, -1212, -1212, 504, 1148, 439, -35, 526, 1416, 439, - -35, -1212, -14, -1212, -1212, 439, -1212, 439, -1212, -14, - -1212, 439, -14, -1212, -14, -1212, -14, 439, -1212, -1212, - -1212, -106, -1212, 275, 439, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -14, -1212, -1212, -1212, -1212, -14, - -14, -14, -1212, -14, -14, -14, -14, 439, -1212, -14, - 439, 439, 439, 439, -1212, -1212, -14, -14, -106, -1212, - -1212, -1212, -14, -106, 439, -14, -14, -14, -14, -1212, - -14, -1212, -14, 439, -14, 439, -14, -14, 439, -14, - 439, -14, 439, -14, 406, 425, -1212, 725, 439, -1212, - -1212, -1212, -1212, -14, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -14, -106, -14, -106, -1212, - -14, -106, -14, -106, -14, -106, -14, -106, -14, -1212, - -106, -14, -1212, -1212, -14, -1212, -1212, -1212, -106, -14, - -14, -106, -14, -106, -1212, -1212, -14, -1212, -106, -1212, - -1212, -14, 518, -1212, -1212, -1212, -1212, -1212, -1212, 290, - -1212, -35, 491, -1212, 503, 503, 503, 503, 56, 139, - 439, 56, 439, -1212, 504, -1212, -1212, -1212, -1212, -1212, - -1212, -35, -1212, -35, -1212, 56, 148, 439, 56, 439, - 371, 555, -1212, 503, -1212, 82, 439, -1212, 439, -1212, - 439, -1212, 439, -1212, 491, -1212, -1212, 491, 491, -1212, - 429, -1212, -1212, -1212, -1212, 457, 242, 566, 662, -1212, - -35, 900, -1212, -35, 131, -1212, 1081, 303, -1212, 1081, - 452, -1212, 586, -1212, 462, -1212, 984, 439, -35, -1212, - -1212, -35, -1212, 1081, 476, 439, 265, 98, -1212, -1212, - -1212, -14, -1212, -14, -1212, -1212, -1212, -1212, -14, -14, - -14, -14, -14, -14, -14, -1212, -14, -1212, -14, -1212, - -14, -14, -14, -14, -1212, -14, -14, -1212, -14, -1212, - -1212, -14, -14, -14, -14, -1212, -1212, -1212, -1212, -1212, - 456, 429, -1212, 725, 491, -1212, -14, -1212, -14, -1212, - -14, -1212, -14, -1212, -1212, 439, -14, -14, -14, -1212, - 439, -14, -14, -1212, -14, -14, -1212, -14, -1212, -1212, - -14, -1212, 439, -1212, -1212, -14, -14, -14, -106, -14, - -1212, -14, -14, 439, -1212, -1212, -1212, -1212, -1212, -1212, - 439, -14, -14, 439, 439, 439, 439, 439, 439, -1212, - -1212, 439, 310, 439, 781, 781, 439, -1212, 475, -1212, - -1212, 439, 1029, 439, 439, 439, -1212, -1212, 491, -1212, - -1212, -1212, 439, -1212, 405, -1212, -1212, 131, -1212, 303, - -1212, -1212, -1212, 303, -1212, -1212, 1081, -1212, 1081, 586, - -1212, -1212, -1212, 1298, -1212, 1609, -1212, 371, -35, -1212, - -14, 1383, 439, 504, -1212, -1212, -14, -14, -14, -14, - -1212, -1212, -14, -14, -14, -1212, -1212, -14, -14, -1212, - -14, -1212, -1212, -1212, -1212, -1212, -14, -1212, -106, -14, - -1212, -14, -1212, -1212, -1212, 1041, -1212, 439, -14, -14, - -14, -1212, -14, -14, -14, -14, -1212, -14, -1212, -14, - -1212, -1212, 439, -14, 439, -14, -1212, -14, 526, -1212, - -106, -14, -14, -1212, 618, 618, 618, 618, -1212, -1212, - -1212, 439, 439, -1212, -1212, -35, -1212, 618, 877, -1212, - -1212, 255, 577, 580, 303, -1212, -1212, -1212, -1212, 1081, - 388, 439, -1212, -1212, -1212, 546, 439, -106, -35, -1212, - -1212, -1212, -14, -106, -14, -106, -14, -14, -106, -1212, - -1212, -14, -14, 550, 877, -1212, -14, -14, -1212, -14, - -1212, -1212, -14, -1212, -14, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -14, -1212, -106, -1212, 265, -14, 1292, - -1212, -35, 688, -1212, -35, -1212, 836, -1212, -35, 781, - 1086, -1212, -1212, 577, 580, 580, -1212, 1081, 439, -35, - 439, 371, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -106, -1212, -106, -14, -1212, -14, -1212, - -14, -14, -14, -1212, -14, -14, -14, -1212, -1212, -14, - -14, -106, -14, -1212, -1212, -1212, -1212, 439, -1212, -14, - -14, -14, -35, -35, 1416, 1982, -1212, -1212, 1658, -1212, - 2505, 439, 1448, -1212, -1212, -35, 580, -1212, 781, 439, - 893, 439, 439, -14, -14, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -14, -14, -14, -14, -14, 439, -1212, -14, - -14, -14, -14, -14, 439, -1212, -14, -1212, -14, -1212, - -14, -1212, -14, -1212, -1212, -14, -106, -1212, -1212, 781, - 439, 92, 439, 894, 894, 737, 737, -1212, 351, 485, - 894, 569, 569, -1212, 333, -1212, 439, -1212, -1212, 265, - -14, -1212, -1212, -14, -14, -1212, -14, -106, -1212, -1212, - -14, -14, -1212, -14, -106, -14, -1212, -1212, -14, -14, - -1212, -14, -106, -14, -1212, -14, -14, -1212, -14, -14, - -1212, -14, -14, -1212, -14, -1212, -14, -14, -1212, -14, - -1212, -14, -1212, 439, 439, -1212, -1212, 111, -1212, 491, - -1212, -1212, 351, -1212, 1081, 571, -1212, -1212, -1212, 351, - -1212, 1081, 571, -1212, -1212, -1212, 571, -1212, -1212, 333, - -1212, -1212, -1212, 333, -1212, -1212, -1212, -1212, -14, -1212, - -14, 439, -14, -14, -14, -14, -14, -14, 439, -14, - -14, -14, -14, -1212, -1212, -1212, -1212, 571, -1212, 565, - -1212, -1212, 571, -1212, -1212, -1212, -1212, -1212, -1212, -14, - 439, -14, -1212, -1212, -1212 + 2593, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, 89, -1247, -1247, + -1247, 367, -1247, -1247, -1247, 367, -1247, -1247, -1247, -1247, + -1247, -1247, 367, 367, -1247, 367, -1247, -88, 367, -1247, + 367, -1247, 367, -1247, -1247, -1247, 367, -1247, 367, -1247, + 367, -1247, 367, -1247, 367, -1247, 367, -1247, 367, -1247, + 367, -1247, -1247, -1247, -1247, -1247, -1247, -1247, 367, -1247, + -1247, -1247, -1247, -1247, -1247, 367, -1247, 367, -1247, 367, + -1247, 367, -1247, 367, -1247, 367, -1247, -1247, -1247, -43, + -43, -43, -43, -43, -1247, 59, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43, -43, 1013, + -43, -43, -43, 78, -1247, -1247, -88, -1247, -88, -1247, + -88, -88, -1247, -88, -1247, -1247, -1247, 367, -1247, -88, + -88, -1247, -88, -88, -88, -88, -88, -88, -88, -88, + -88, -1247, -88, -1247, -88, -1247, -1247, -1247, -1247, -29, + -1247, -1247, -1247, -1247, -1247, -2, 44, 74, -1247, -1247, + -1247, -1247, 287, -1247, -88, -1247, -88, -88, -88, -1247, + -88, 367, 874, 134, 87, 87, 604, -43, 56, 289, + 203, 699, 356, 287, 23, 287, 81, 287, 97, 308, + 287, 241, 1444, -1247, -1247, -1247, 458, 71, -1247, -1247, + 71, -1247, -1247, 71, -1247, -1247, 293, 1013, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, 527, -1247, -1247, -1247, -1247, + 213, 221, 231, 604, -1247, -88, -1247, -88, 367, -1247, + -1247, -1247, -1247, 367, -88, 367, -88, -1247, 367, 367, + -88, -88, -1247, -1247, -1247, -1247, -88, -88, -88, -88, + -1247, -88, -1247, -88, -88, -88, -1247, -1247, -1247, -1247, + 367, 367, -1247, -1247, -88, 367, -1247, -1247, 367, -88, + -88, -1247, -88, -1247, -1247, 367, -1247, -88, -88, 367, + -1247, -1247, -88, -88, 367, -1247, -1247, -88, -88, 367, + -1247, -1247, -88, -88, 367, -1247, -1247, -88, -88, 367, + -88, 367, -1247, -1247, -88, 367, -1247, -88, -1247, -1247, + -1247, -1247, 367, -1247, -88, 367, -88, -88, -88, -88, + -88, -1247, -88, 367, 287, -1247, 395, 527, -1247, -1247, + 459, 287, 160, 287, 287, -43, -43, 42, 332, 57, + -43, -43, 359, 359, 42, 57, 359, 359, 604, 395, + 287, 443, -43, -43, 285, 287, -43, -43, 279, 462, + 359, -43, 469, -1247, 469, -43, 462, 359, -43, 462, + 359, -43, 462, 359, -43, -1247, -1247, 584, 149, -1247, + -43, 359, -43, 1444, 527, 78, -1247, -43, 293, 78, + -1247, 468, 78, -1247, 293, 473, 1013, -1247, 527, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, -88, -88, 367, + -1247, 367, -1247, -1247, -88, -88, 367, -88, -1247, -1247, + -1247, -88, -88, -88, -1247, -88, 367, -1247, -1247, -1247, + -1247, -1247, -1247, 367, 287, -88, -1247, -88, -88, -1247, + -88, 367, -88, -88, 287, -88, -88, -1247, -88, -88, + 604, 287, -1247, -88, -88, -88, -1247, -88, -88, 367, + -1247, -1247, -88, -88, -88, 367, 287, -88, -88, -88, + -88, -1247, 287, 287, -88, -88, 287, -88, -88, 287, + -88, -88, -1247, -1247, 380, -1247, 287, -88, -1247, 287, + -88, -88, -88, 231, 287, -1247, 287, -88, -1247, -88, + 367, -88, -1247, -88, 367, 287, -1247, 512, 472, -43, + -43, -1247, -1247, 469, -1247, 818, 485, 469, 287, 134, + 57, 515, 287, 527, 1261, -1247, 462, 76, 76, 462, + -43, 462, 57, -1247, 462, 462, 425, 287, 470, -1247, + -1247, -1247, 462, 76, 76, -1247, -1247, -43, 287, 134, + 462, 1017, -1247, 462, 327, -1247, -1247, -1247, -1247, 462, + 86, -1247, 462, 198, -1247, 462, 20, -1247, -1247, 527, + -1247, -1247, 527, -1247, -1247, -1247, 462, 289, 1580, 287, + 527, -1247, -1247, 468, 835, 287, -43, 511, 1730, 287, + -43, -1247, -88, -1247, -1247, 287, -1247, 287, -1247, -88, + -1247, 287, -88, -1247, -88, -1247, -88, 287, -1247, -1247, + -1247, 367, -1247, 231, 287, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -88, -1247, -1247, -1247, -1247, -88, + -88, -88, -1247, -88, -88, -88, -88, 287, -1247, -88, + 287, 287, 287, 287, -1247, -1247, -88, -88, 367, -1247, + -1247, -1247, -88, 367, 287, -88, -88, -88, -88, -1247, + -88, -1247, -88, 287, -88, 287, -88, -88, 287, -88, + 287, -88, 287, -88, 408, 460, -1247, 543, 287, -1247, + -1247, -1247, -1247, -88, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -88, 367, -88, 367, -1247, + -88, 367, -88, 367, -88, 367, -88, 367, -88, -1247, + 367, -88, -1247, -1247, -88, -1247, -1247, -1247, 367, -88, + -88, 367, -88, 367, -1247, -1247, -88, -1247, 367, -1247, + -1247, -88, 472, -1247, -1247, -1247, -1247, -1247, -1247, 62, + -1247, -43, 527, -1247, 451, 451, 451, 451, 42, 58, + 287, 42, 287, -1247, 468, -1247, -1247, -1247, -1247, -1247, + -1247, -43, -1247, -43, -1247, 42, 281, 287, 42, 287, + 395, 520, -1247, 451, -1247, 279, 287, -1247, 287, -1247, + 287, -1247, 287, -1247, 527, -1247, -1247, 527, 527, -1247, + 402, -1247, -1247, -1247, -1247, 443, 61, 603, 301, -1247, + -43, 398, -1247, -43, 275, -1247, 818, 128, -1247, 818, + 319, -1247, 584, -1247, 423, -1247, 1222, 287, 310, -1247, + -1247, -43, -1247, 818, 469, 287, 247, 85, -1247, -1247, + -1247, -88, -1247, -88, -1247, -1247, -1247, -1247, -88, -88, + -88, -88, -88, -88, -88, -1247, -88, -1247, -88, -1247, + -88, -88, -88, -88, -1247, -88, -88, -1247, -88, -1247, + -1247, -88, -88, -88, -88, -1247, -1247, -1247, -1247, -1247, + 476, 402, -1247, 543, 527, -1247, -88, -1247, -88, -1247, + -88, -1247, -88, -1247, -1247, 287, -88, -88, -88, -1247, + 287, -88, -88, -1247, -88, -88, -1247, -88, -1247, -1247, + -88, -1247, 287, -1247, -1247, -88, -88, -88, 367, -88, + -1247, -88, -88, 287, -88, 287, -1247, -1247, -1247, -1247, + -1247, -1247, 287, -88, -88, 287, 287, 287, 287, 287, + 287, -1247, -1247, 287, 352, 287, 604, 604, 287, -1247, + 470, -1247, -1247, 287, 528, 287, 287, 287, -1247, -1247, + 527, -1247, -1247, -1247, 287, -1247, 148, -1247, -1247, 275, + -1247, 128, -1247, -1247, -1247, 128, -1247, -1247, 818, -1247, + 818, 584, -1247, -1247, -1247, 1562, -1247, 1013, -1247, 395, + 395, -1247, -43, -1247, -88, 1531, 287, 468, -1247, -1247, + -88, -88, -88, -88, -1247, -1247, -88, -88, -88, -1247, + -1247, -88, -88, -1247, -88, -1247, -1247, -1247, -1247, -1247, + -88, -1247, 367, -88, -1247, -88, -1247, -1247, -1247, 678, + -1247, 287, -88, -88, -88, -1247, -88, -88, -88, -88, + -1247, -88, -1247, -88, -1247, -1247, 287, -88, 287, -88, + -88, -1247, -88, 511, -1247, 367, -88, -88, -1247, 633, + 633, 633, 633, -1247, -1247, -1247, 287, 287, -1247, -1247, + -43, -1247, 633, 761, -1247, -1247, 430, 547, 589, 128, + -1247, -1247, -1247, -1247, 818, 497, 287, -1247, -1247, -1247, + 261, -1247, 488, 287, 367, 442, -1247, -1247, -1247, -88, + 367, -88, 367, -88, -88, 367, -1247, -1247, -88, -88, + 414, 761, -1247, -88, -88, -1247, -88, -1247, -1247, -88, + -1247, -88, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -88, -1247, 367, -88, -1247, 247, -88, -88, 287, 1430, + -1247, -43, 713, -1247, -43, -1247, 989, -1247, -43, 604, + 1113, -1247, -1247, 547, 589, 589, -1247, 818, -1247, -43, + -1247, 287, 395, 395, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, 367, -1247, 367, -88, + -1247, -88, -1247, -88, -88, -88, -1247, -88, -88, -88, + -1247, -1247, -88, -88, 367, -88, -1247, -1247, -1247, -1247, + 287, -88, -88, -88, -88, -43, -43, 1730, 2698, -1247, + -1247, 2579, -1247, 2619, 287, 1678, -1247, -1247, -43, 589, + -1247, 604, 287, 1720, 287, -1247, -1247, -88, -88, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, -88, -88, -88, -88, + -88, 287, -1247, -88, -88, -88, -88, -88, 287, -1247, + -88, -1247, -88, -1247, -88, -1247, -88, -1247, -1247, -88, + 367, -1247, 604, 287, 68, 287, 637, 637, 330, 330, + -1247, 573, 494, 637, 508, 508, -1247, 403, -1247, 287, + -1247, -1247, 247, -88, -1247, -1247, -88, -88, -1247, -88, + 367, -1247, -1247, -88, -88, -1247, -88, 367, -88, -1247, + -1247, -88, -88, -1247, -88, 367, -88, -1247, -88, -88, + -1247, -88, -88, -1247, -88, -88, -1247, -88, -1247, -88, + -88, -1247, -88, -1247, -88, -1247, 287, 287, -1247, -1247, + 95, -1247, 527, -1247, -1247, 573, -1247, 818, 541, -1247, + -1247, -1247, 573, -1247, 818, 541, -1247, -1247, -1247, 541, + -1247, -1247, 403, -1247, -1247, -1247, 403, -1247, -1247, -1247, + -1247, -88, -1247, -88, 287, -88, -88, -88, -88, -88, + -88, 287, -88, -88, -88, -88, -1247, -1247, -1247, -1247, + 541, -1247, 427, -1247, -1247, 541, -1247, -1247, -1247, -1247, + -1247, -1247, -88, 287, -88, -1247, -1247, -1247 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1167,47 +1170,47 @@ static const yytype_int16 yydefact[] = { 0, 419, 406, 395, 405, 161, 431, 454, 397, 483, - 486, 601, 645, 680, 683, 508, 501, 356, 560, 493, - 490, 498, 496, 612, 667, 396, 421, 432, 398, 420, + 486, 604, 648, 683, 686, 508, 501, 356, 563, 493, + 490, 498, 496, 615, 670, 396, 421, 432, 398, 420, 484, 488, 487, 509, 494, 491, 499, 0, 4, 5, - 2, 0, 13, 346, 347, 0, 584, 385, 383, 384, - 386, 387, 0, 0, 3, 0, 12, 416, 0, 586, - 0, 11, 0, 588, 468, 469, 0, 14, 0, 590, - 0, 15, 0, 592, 0, 16, 0, 594, 0, 17, - 0, 585, 541, 539, 540, 542, 543, 587, 0, 589, - 591, 593, 595, 19, 18, 0, 7, 0, 8, 0, + 2, 0, 13, 346, 347, 0, 587, 385, 383, 384, + 386, 387, 0, 0, 3, 0, 12, 416, 0, 589, + 0, 11, 0, 591, 468, 469, 0, 14, 0, 593, + 0, 15, 0, 595, 0, 16, 0, 597, 0, 17, + 0, 588, 544, 542, 543, 545, 546, 590, 0, 592, + 594, 596, 598, 19, 18, 0, 7, 0, 8, 0, 9, 0, 10, 0, 6, 0, 1, 73, 74, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 162, 0, 357, 0, 394, 0, 0, 407, 0, 411, 412, 417, 0, 422, 0, 0, 455, 0, 0, 423, 0, 423, 0, 423, 0, - 503, 561, 0, 602, 0, 613, 627, 614, 628, 615, - 616, 630, 617, 618, 619, 620, 621, 622, 623, 624, - 625, 626, 0, 610, 0, 646, 0, 0, 0, 651, + 503, 564, 0, 605, 0, 616, 630, 617, 631, 618, + 619, 633, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 0, 613, 0, 649, 0, 0, 0, 654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 75, 76, 609, 0, 0, 634, 636, - 0, 658, 660, 0, 668, 670, 0, 0, 40, 20, + 0, 0, 0, 75, 76, 612, 0, 0, 637, 639, + 0, 661, 663, 0, 671, 673, 0, 0, 40, 20, 37, 38, 39, 41, 42, 0, 163, 21, 22, 26, 0, 25, 35, 0, 164, 154, 361, 0, 0, 446, 447, 369, 400, 0, 0, 0, 0, 399, 0, 0, - 0, 0, 545, 548, 546, 549, 0, 0, 0, 0, + 0, 0, 548, 551, 549, 552, 0, 0, 0, 0, 408, 0, 413, 0, 423, 0, 433, 434, 435, 436, - 0, 0, 458, 457, 451, 0, 573, 473, 0, 0, - 0, 472, 0, 569, 570, 0, 428, 190, 424, 0, - 485, 576, 0, 0, 0, 492, 579, 0, 0, 0, - 497, 582, 0, 0, 0, 515, 511, 190, 190, 0, - 190, 0, 502, 563, 0, 0, 596, 0, 597, 604, - 605, 611, 0, 648, 0, 0, 0, 0, 0, 0, - 0, 653, 0, 0, 0, 34, 27, 0, 33, 23, + 0, 0, 458, 457, 451, 0, 576, 473, 0, 0, + 0, 472, 0, 572, 573, 0, 428, 190, 424, 0, + 485, 579, 0, 0, 0, 492, 582, 0, 0, 0, + 497, 585, 0, 0, 0, 515, 511, 190, 190, 0, + 190, 0, 502, 566, 0, 0, 599, 0, 600, 607, + 608, 614, 0, 651, 0, 0, 0, 0, 0, 0, + 0, 656, 0, 0, 0, 34, 27, 0, 33, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 506, 0, 0, 504, - 0, 0, 0, 0, 0, 0, 635, 0, 0, 0, - 659, 0, 0, 669, 0, 0, 0, 650, 0, 29, + 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, + 662, 0, 0, 672, 0, 0, 0, 653, 0, 29, 31, 28, 36, 168, 171, 165, 166, 155, 158, 0, 160, 0, 153, 365, 0, 351, 0, 0, 348, 353, 362, 359, 0, 0, 371, 375, 0, 223, 393, 204, @@ -1217,8 +1220,8 @@ 450, 459, 190, 0, 0, 0, 0, 0, 0, 190, 190, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 512, 48, 513, 0, 190, 516, 0, - 0, 0, 598, 606, 0, 649, 0, 0, 525, 662, - 0, 0, 692, 80, 0, 0, 32, 0, 0, 0, + 0, 0, 601, 609, 0, 652, 0, 0, 525, 665, + 0, 0, 695, 80, 0, 0, 32, 0, 0, 0, 0, 350, 355, 0, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 390, 0, 0, 0, 0, 0, 415, @@ -1226,130 +1229,131 @@ 0, 0, 470, 0, 0, 191, 426, 427, 489, 0, 0, 495, 0, 0, 500, 0, 0, 44, 58, 0, 45, 49, 0, 510, 505, 514, 0, 0, 0, 0, - 607, 603, 647, 0, 0, 0, 0, 0, 0, 0, - 0, 652, 156, 159, 169, 0, 172, 0, 367, 351, + 610, 606, 650, 0, 0, 0, 0, 0, 0, 0, + 0, 655, 156, 159, 169, 0, 172, 0, 367, 351, 366, 0, 351, 363, 359, 358, 0, 0, 380, 381, 376, 0, 368, 372, 0, 224, 225, 226, 227, 228, 229, 230, 231, 232, 0, 233, 234, 235, 236, 0, - 0, 0, 392, 0, 553, 0, 553, 0, 523, 0, + 0, 0, 392, 0, 556, 0, 556, 0, 523, 0, 0, 0, 0, 0, 199, 198, 190, 190, 0, 401, 197, 196, 190, 0, 0, 0, 438, 0, 438, 465, 0, 456, 0, 0, 0, 0, 0, 190, 0, 190, - 0, 190, 0, 190, 48, 0, 59, 0, 0, 564, - 565, 566, 567, 0, 174, 100, 133, 136, 144, 148, - 98, 600, 82, 88, 89, 93, 0, 85, 0, 92, + 0, 190, 0, 190, 48, 0, 59, 0, 0, 567, + 568, 569, 570, 0, 174, 100, 133, 136, 144, 148, + 98, 603, 82, 88, 89, 93, 0, 85, 0, 92, 85, 0, 85, 0, 85, 0, 85, 0, 85, 84, - 0, 598, 583, 608, 638, 537, 657, 666, 0, 662, - 662, 0, 80, 0, 661, 526, 378, 681, 0, 81, - 682, 0, 0, 167, 170, 352, 364, 349, 360, 0, + 0, 601, 586, 611, 641, 540, 660, 669, 0, 665, + 665, 0, 80, 0, 664, 526, 378, 684, 0, 81, + 685, 0, 0, 167, 170, 352, 364, 349, 360, 0, 389, 0, 373, 370, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 544, 0, 547, 391, 550, 551, 404, + 0, 0, 0, 547, 0, 550, 391, 553, 554, 404, 403, 0, 414, 0, 430, 0, 0, 0, 0, 0, - 27, 0, 471, 0, 568, 0, 0, 574, 0, 577, - 0, 580, 0, 46, 0, 43, 68, 0, 0, 53, - 71, 55, 66, 67, 559, 0, 0, 0, 0, 91, + 27, 0, 471, 0, 571, 0, 0, 577, 0, 580, + 0, 583, 0, 46, 0, 43, 68, 0, 0, 53, + 71, 55, 66, 67, 562, 0, 0, 0, 0, 91, 0, 0, 117, 0, 0, 118, 0, 0, 119, 0, - 0, 120, 0, 83, 0, 599, 0, 0, 0, 663, - 664, 0, 665, 0, 0, 0, 0, 0, 684, 686, + 0, 120, 0, 83, 0, 602, 0, 0, 0, 666, + 667, 0, 668, 0, 0, 0, 0, 0, 687, 689, 157, 0, 382, 378, 374, 237, 238, 239, 190, 190, - 190, 190, 553, 190, 190, 552, 553, 557, 518, 202, + 190, 190, 556, 190, 190, 555, 556, 560, 518, 202, 0, 0, 438, 190, 449, 190, 190, 437, 438, 444, - 466, 461, 0, 190, 190, 571, 575, 578, 581, 52, + 466, 461, 0, 190, 190, 574, 578, 581, 584, 52, 48, 71, 60, 0, 0, 70, 190, 96, 85, 94, 0, 90, 85, 87, 101, 0, 85, 85, 85, 134, 0, 85, 85, 137, 0, 85, 145, 0, 149, 150, - 0, 79, 0, 655, 644, 638, 638, 80, 0, 80, - 637, 0, 0, 0, 379, 524, 674, 675, 672, 673, - 0, 688, 0, 0, 0, 0, 0, 0, 0, 555, - 554, 0, 0, 0, 0, 0, 0, 442, 0, 439, - 441, 0, 0, 0, 0, 0, 47, 69, 0, 54, - 57, 72, 0, 95, 0, 86, 99, 0, 121, 0, - 122, 123, 132, 0, 124, 125, 0, 126, 0, 0, - 173, 639, 640, 0, 641, 0, 643, 27, 0, 656, - 0, 0, 0, 0, 685, 377, 0, 0, 0, 0, - 556, 558, 190, 518, 518, 517, 203, 190, 190, 443, - 190, 445, 188, 186, 185, 187, 190, 467, 0, 190, - 460, 0, 572, 64, 56, 0, 562, 0, 102, 103, - 104, 105, 85, 85, 85, 85, 138, 0, 146, 142, - 151, 152, 0, 80, 0, 0, 538, 378, 0, 691, - 0, 688, 688, 687, 0, 0, 0, 0, 521, 519, - 520, 0, 0, 440, 462, 0, 463, 0, 0, 63, - 97, 0, 0, 0, 0, 127, 128, 129, 130, 0, - 0, 0, 147, 642, 654, 0, 0, 0, 0, 690, - 689, 243, 214, 0, 209, 0, 80, 220, 0, 192, - 189, 0, 475, 65, 0, 61, 106, 107, 108, 109, - 110, 111, 85, 139, 0, 143, 141, 535, 530, 531, - 532, 533, 534, 378, 528, 0, 536, 0, 0, 0, + 0, 79, 0, 658, 647, 641, 641, 80, 0, 80, + 640, 0, 0, 0, 0, 0, 379, 524, 677, 678, + 675, 676, 0, 691, 0, 0, 0, 0, 0, 0, + 0, 558, 557, 0, 0, 0, 0, 0, 0, 442, + 0, 439, 441, 0, 0, 0, 0, 0, 47, 69, + 0, 54, 57, 72, 0, 95, 0, 86, 99, 0, + 121, 0, 122, 123, 132, 0, 124, 125, 0, 126, + 0, 0, 173, 642, 643, 0, 644, 0, 646, 27, + 27, 527, 0, 659, 0, 0, 0, 0, 688, 377, + 0, 0, 0, 0, 559, 561, 190, 518, 518, 517, + 203, 190, 190, 443, 190, 445, 188, 186, 185, 187, + 190, 467, 0, 190, 460, 0, 575, 64, 56, 0, + 565, 0, 102, 103, 104, 105, 85, 85, 85, 85, + 138, 0, 146, 142, 151, 152, 0, 80, 0, 378, + 0, 541, 378, 0, 694, 0, 691, 691, 690, 0, + 0, 0, 0, 521, 519, 520, 0, 0, 440, 462, + 0, 463, 0, 0, 63, 97, 0, 0, 0, 0, + 127, 128, 129, 130, 0, 0, 0, 147, 645, 657, + 0, 529, 0, 0, 0, 0, 693, 692, 243, 214, + 0, 209, 0, 80, 220, 0, 192, 189, 0, 475, + 65, 0, 61, 106, 107, 108, 109, 110, 111, 85, + 139, 0, 143, 141, 538, 533, 534, 535, 536, 537, + 378, 531, 0, 378, 539, 0, 0, 0, 0, 0, 213, 0, 0, 208, 0, 218, 0, 219, 0, 0, - 0, 474, 62, 0, 0, 0, 131, 0, 0, 0, - 0, 27, 183, 180, 179, 182, 200, 181, 201, 217, - 345, 175, 177, 0, 176, 0, 215, 244, 0, 212, - 209, 80, 0, 222, 220, 0, 190, 481, 479, 80, - 80, 0, 112, 113, 114, 115, 140, 0, 527, 194, - 676, 190, 0, 0, 0, 0, 211, 210, 0, 221, - 0, 0, 0, 476, 478, 0, 0, 135, 0, 0, - 0, 0, 0, 0, 194, 216, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, - 337, 338, 297, 246, 248, 250, 252, 0, 245, 270, - 277, 279, 281, 283, 0, 276, 293, 184, 80, 482, - 378, 116, 190, 529, 679, 80, 0, 671, 693, 0, - 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, - 0, 0, 0, 242, 0, 477, 0, 195, 678, 0, - 190, 193, 344, 190, 190, 298, 190, 0, 241, 340, - 190, 190, 247, 190, 0, 190, 249, 342, 190, 190, - 251, 190, 0, 190, 253, 190, 190, 271, 190, 190, - 278, 190, 190, 280, 190, 282, 190, 190, 284, 190, - 294, 190, 480, 0, 0, 299, 302, 0, 300, 0, - 254, 261, 0, 258, 0, 0, 260, 262, 269, 0, - 266, 0, 0, 268, 272, 275, 0, 273, 285, 0, - 287, 288, 289, 0, 291, 292, 295, 296, 676, 178, - 190, 0, 190, 190, 0, 190, 190, 190, 0, 190, - 190, 190, 190, 677, 301, 343, 257, 0, 255, 0, - 259, 265, 0, 263, 341, 267, 274, 286, 290, 190, - 0, 190, 256, 339, 264 + 0, 474, 62, 0, 0, 0, 131, 0, 530, 0, + 528, 0, 27, 27, 696, 183, 180, 179, 182, 200, + 181, 201, 217, 345, 175, 177, 0, 176, 0, 215, + 244, 0, 212, 209, 80, 0, 222, 220, 0, 190, + 481, 479, 80, 80, 0, 112, 113, 114, 115, 140, + 0, 194, 679, 190, 190, 0, 0, 0, 0, 211, + 210, 0, 221, 0, 0, 0, 476, 478, 0, 0, + 135, 0, 0, 0, 0, 698, 697, 0, 194, 216, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 297, 246, 248, 250, + 252, 0, 245, 270, 277, 279, 281, 283, 0, 276, + 293, 184, 80, 482, 378, 116, 190, 532, 682, 80, + 0, 674, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 242, 0, 477, 0, + 195, 681, 0, 190, 193, 344, 190, 190, 298, 190, + 0, 241, 340, 190, 190, 247, 190, 0, 190, 249, + 342, 190, 190, 251, 190, 0, 190, 253, 190, 190, + 271, 190, 190, 278, 190, 190, 280, 190, 282, 190, + 190, 284, 190, 294, 190, 480, 0, 0, 299, 302, + 0, 300, 0, 254, 261, 0, 258, 0, 0, 260, + 262, 269, 0, 266, 0, 0, 268, 272, 275, 0, + 273, 285, 0, 287, 288, 289, 0, 291, 292, 295, + 296, 679, 178, 190, 0, 190, 190, 0, 190, 190, + 190, 0, 190, 190, 190, 190, 680, 301, 343, 257, + 0, 255, 0, 259, 265, 0, 263, 341, 267, 274, + 286, 290, 190, 0, 190, 256, 339, 264 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -1212, -1212, -1212, -222, -223, -191, -1212, 272, -194, 311, - -1212, -1212, -1212, -1212, -1212, -1212, -196, -325, -656, -50, - -728, -646, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -567, - -230, -1212, -1212, -1212, -871, -1212, -1212, -218, 1195, 1389, - -57, -54, -1212, -704, -480, -392, -1212, -1212, -148, -1212, - -1212, -141, -1212, -1212, -1212, -134, -254, -1212, -1212, -803, - -1212, -1212, -1212, -1212, -1212, -788, -1212, -1212, -1212, -1212, - -251, -1212, -1212, -1212, 248, -1212, -1212, -1212, -1212, -1212, - 194, -1212, -1212, -500, -1212, -1212, -708, -1212, -1212, -401, - -1212, -1212, -1212, -1212, -550, 1538, -368, -1211, -499, -1212, - -1212, -1212, -769, -915, -51, -1212, -449, -1212, -1212, -1212, - -1212, -448, -342, 164, -1212, -1212, -118, -995, -321, -400, - -976, -674, -1212, -913, -549, -1212, -1212, -1212, -1212, -551, - -1212, -1212, -1212, -1212, -660, -547, -1212, -621, -1212, -755, - -1212, -651, -1212, 755, -419, -197, 561, -421, 30, 5, - -320, 132, -1212, -1212, -1212, 227, -1212, -79, -1212, -80, - -1212, -1212, -1212, -1212, -1212, -1212, -833, -1212, -1212, -1212, - -1212, 636, 638, 639, 641, -280, 1033, -1212, -1212, -75, - 31, -1212, -1212, -1212, -1212, -1212, -108, -1212, -1212, -1212, - -1212, 3, -1212, 413, -69, -1212, -1212, -1212, 646, -1212, - -1212, -1212, -636, -1212, -1212, -1212, 581, 583, 136, -182, - 4, 301, -1212, -1212, -1212, -1212, -1212, -1212, -1212, -364, - -814, -922, -1212, -1212, 654, 657, -1212, 220, -1212, -420, - -1212, -1212, -1212, -185, -1212, 671, -1212, -161, -1212, 672, - -1212, -189, -1212, 678, -1212, -173, -1212, -1212, 410, -1212, - -1212, -1212, -1212, -1212, 436, -327, -1212, -1212, -377, -1212, - -1212, -790, -1212, -1212, -1212, -786, -1212, -1212, 681, -1212, - -1212, 622, -1212, 625, -1212, -1212, 225, -609, 230, 231, - 237, 706, -1212, -1212, -1212, -1212, -1212, 709, -1212, -1212, - -1212, -1212, 711, -1212, -1212, 713, -1212, -1212, 718, -1212, - -1212, 719, -183, -351, 130, -1212, -1212, -1212, -1212, -1212, - -1212, -1212, -1212, -1212, -1212, 864, -1212, 537, -235, -1212, - -120, -214, -1212, -1212, -88, -1212, 104, -1212, -1212, -1212, - -813, -1212, -1212, -1212, 549, -36, 887, -1212, -1212, 557, - -1111, -488, -1212, -1007, 888, -1212, -1212, -1212, -34, -353, - -1212, -1212 + -1247, -1247, -1247, -222, -229, -191, -1247, 276, -194, 309, + -1247, -1247, -1247, -1247, -1247, -1247, -58, -227, -653, -33, + -784, -651, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -547, + -230, -1247, -1247, -1247, -852, -1247, -1247, -223, 1233, 1229, + -57, 1273, -1247, -731, -577, -654, -1247, -1247, -140, -1247, + -1247, -130, -1247, -1247, -1247, -117, -273, -1247, -1247, -783, + -1247, -1247, -1247, -1247, -1247, -787, -1247, -1247, -1247, -1247, + -641, -1247, -1247, -1247, 114, -1247, -1247, -1247, -1247, -1247, + 178, -1247, -1247, -488, -1247, -1247, -666, -1247, -1247, -598, + -1247, -1247, -1247, -1247, -555, 1591, -388, -1246, -524, -1247, + -1247, -1247, -747, -934, -36, -1247, -474, -1247, -1247, -1247, + -1247, -464, -340, 152, -1247, -1247, -445, -1027, -336, -415, + -1012, -637, -1247, -804, -569, -1247, -1247, -1247, -1247, -570, + -1247, -1247, -1247, -1247, -590, -565, -1247, -662, -1247, -413, + -1247, -803, -1247, 748, -416, -143, 550, -426, 33, -65, + -326, 129, -1247, -1247, -1247, 224, -1247, -82, -1247, -67, + -1247, -1247, -1247, -1247, -1247, -1247, -836, -1247, -1247, -1247, + -1247, 635, 636, 641, 642, -303, 505, -1247, -1247, -74, + 31, -1247, -1247, -1247, -1247, -1247, -108, -1247, -1247, -1247, + -1247, 10, -1247, 564, -105, -1247, -1247, -1247, 647, -1247, + -1247, -1247, -636, -1247, -1247, -1247, 580, 590, 546, -177, + 4, 312, -1247, -1247, -1247, -1247, -1247, -1247, -1247, -368, + -809, -862, -1247, -1247, 659, 663, -1247, 223, -1247, -425, + -1247, -1247, -1247, -187, -1247, 672, -1247, -184, -1247, 674, + -1247, -181, -1247, 675, -1247, -189, -1247, -1247, 409, -1247, + -1247, -1247, -1247, -1247, 797, -345, -1247, -1247, -383, -1247, + -1247, -782, -1247, -296, -1247, -1247, -786, -1247, -1247, 679, + -1247, -1247, 621, -1247, 622, -1247, -1247, 226, -600, 232, + 242, 243, 691, -1247, -1247, -1247, -1247, -1247, 709, -1247, + -1247, -1247, -1247, 717, -1247, -1247, 718, -1247, -1247, 719, + -1247, -1247, 724, -188, -351, 111, -1247, -1247, -1247, -1247, + -1247, -1247, -1247, -1247, -1247, -1247, 859, -1247, 537, -233, + -1247, -116, -211, -1247, -1247, -103, -1247, 98, -1247, -1247, + -1247, -814, -1247, -1247, -1247, 525, -23, 876, -1247, -1247, + 540, -1098, -521, -1247, -1028, 881, -1247, -1247, -1247, -62, + -338, -1247, -1247, -1247 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -1357,40 +1361,40 @@ { -1, 37, 38, 39, 235, 620, 237, 880, 238, 470, 239, 240, 419, 420, 241, 348, 242, 243, 894, 589, - 503, 590, 504, 695, 890, 591, 809, 969, 592, 810, - 893, 1034, 1035, 1114, 811, 812, 813, 895, 109, 215, + 503, 590, 504, 695, 890, 591, 809, 971, 592, 810, + 893, 1038, 1039, 1121, 811, 812, 813, 895, 109, 215, 382, 456, 922, 609, 749, 819, 712, 713, 714, 715, - 716, 717, 718, 905, 1037, 719, 720, 721, 910, 722, - 723, 914, 1047, 1124, 1197, 724, 1091, 725, 917, 1049, - 726, 727, 920, 1052, 489, 351, 41, 136, 245, 427, - 428, 429, 615, 430, 431, 617, 729, 730, 1170, 1171, - 1172, 1173, 1027, 1028, 874, 383, 667, 1174, 1219, 673, - 668, 1175, 870, 1017, 448, 449, 1143, 450, 1140, 451, - 452, 1147, 453, 649, 650, 651, 858, 1104, 1102, 1107, - 1105, 1178, 1267, 1322, 1330, 1268, 1337, 1274, 1340, 1345, - 1275, 1350, 1292, 1315, 1262, 1323, 1324, 1331, 1332, 1325, - 1317, 1176, 42, 252, 353, 534, 44, 354, 253, 138, + 716, 717, 718, 905, 1041, 719, 720, 721, 910, 722, + 723, 914, 1051, 1131, 1210, 724, 1096, 725, 917, 1053, + 726, 727, 920, 1056, 489, 351, 41, 136, 245, 427, + 428, 429, 615, 430, 431, 617, 729, 730, 1183, 1184, + 1185, 1186, 1031, 1032, 874, 383, 667, 1187, 1232, 673, + 668, 1188, 870, 1021, 448, 449, 1153, 450, 1150, 451, + 452, 1157, 453, 649, 650, 651, 858, 1111, 1109, 1114, + 1112, 1191, 1281, 1335, 1343, 1282, 1350, 1288, 1353, 1358, + 1289, 1363, 1305, 1328, 1276, 1336, 1337, 1344, 1345, 1338, + 1330, 1189, 42, 252, 353, 534, 44, 354, 253, 138, 247, 538, 248, 441, 624, 435, 436, 621, 619, 254, 255, 445, 446, 634, 542, 630, 845, 631, 853, 46, 47, 48, 49, 50, 51, 454, 140, 52, 53, 256, 437, 557, 55, 143, 271, 468, 455, 147, 273, 471, 56, 257, 58, 149, 203, 298, 299, 492, 59, 60, 275, 276, 787, 277, 278, 279, 258, 259, 457, 876, - 936, 375, 62, 152, 284, 285, 482, 478, 963, 738, - 680, 881, 1029, 63, 64, 65, 290, 486, 1151, 1190, - 1191, 1280, 66, 67, 68, 69, 70, 71, 72, 73, + 938, 375, 62, 152, 284, 285, 482, 478, 965, 738, + 680, 881, 1033, 63, 64, 65, 290, 486, 1161, 1203, + 1204, 1294, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 210, 80, 318, 319, - 506, 320, 321, 509, 937, 953, 461, 659, 941, 520, - 746, 739, 1133, 1134, 1135, 740, 741, 1057, 81, 82, - 83, 260, 84, 261, 85, 86, 262, 770, 263, 264, - 265, 87, 88, 162, 324, 325, 703, 89, 292, 293, - 294, 295, 90, 303, 304, 91, 308, 309, 92, 313, - 314, 93, 94, 327, 599, 95, 164, 331, 332, 514, - 96, 182, 97, 183, 184, 938, 218, 219, 837, 99, - 186, 334, 335, 516, 336, 191, 342, 343, 927, 928, - 742, 743, 100, 221, 222, 605, 939, 102, 224, 225, - 940, 1221, 103, 748, 328, 105, 523, 848, 849, 1002, - 524, 1062 + 506, 320, 321, 509, 939, 955, 461, 659, 943, 520, + 746, 739, 933, 1140, 1141, 1142, 740, 741, 1062, 81, + 82, 83, 260, 84, 261, 85, 86, 262, 770, 263, + 264, 265, 87, 88, 162, 324, 325, 703, 89, 292, + 293, 294, 295, 90, 303, 304, 91, 308, 309, 92, + 313, 314, 93, 94, 327, 599, 95, 164, 331, 332, + 514, 96, 182, 97, 183, 184, 940, 218, 219, 837, + 99, 186, 334, 335, 516, 336, 191, 342, 343, 927, + 928, 742, 743, 100, 221, 222, 605, 941, 102, 224, + 225, 942, 1234, 103, 748, 328, 105, 523, 848, 849, + 1006, 524, 1067, 1148 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1398,602 +1402,616 @@ number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 115, 236, 270, 57, 61, 344, 337, 146, 672, 339, - 479, 187, 188, 532, 871, 531, 291, 307, 906, 347, - 943, 421, 970, 929, 931, 697, 1160, 932, 613, 326, - 45, 54, 434, 907, 519, 312, 911, 485, 842, 345, - 1018, 808, 789, 302, 421, 190, 925, 772, 803, 349, - 926, 1097, 512, 107, 108, 135, 137, 139, 139, 142, - 1, 144, 148, 139, 151, 139, 148, 139, 148, 139, - 148, 139, 148, 161, 163, 1055, 185, 185, 185, 192, - 1314, 193, 1112, 194, 195, 464, 196, 205, 1103, 207, - 1103, 1108, 198, 199, 106, 200, 201, 202, 204, 202, - 206, 202, 208, 209, 918, 211, 1166, 212, 899, 5, - 903, 1, 134, 903, 1312, 266, 903, 10, 711, 903, - 267, 289, 903, 518, 737, 1166, 1, 216, 5, 217, - 220, 223, 338, 226, 15, 340, 26, 145, 244, 189, - 29, 249, 2, 272, 15, 144, 1390, 1180, 5, 114, - 250, 422, 4, 282, 144, 670, 5, 704, 311, 425, - 671, 189, 1013, 251, 1079, 5, 1014, 17, 31, 32, - 1108, 1039, -629, 33, 467, 283, 333, 333, 251, -631, - 1053, 1168, 17, 33, 708, 709, 1040, 26, 350, 1042, - 352, 29, -632, 484, 525, 423, 424, 357, 1353, 359, - 1168, 502, 26, 362, 363, 370, 29, 1115, 513, 364, - 365, 366, 367, 1286, 368, 1061, 369, 202, 371, 626, - 326, 145, 526, 994, 1096, 996, 734, 374, 485, 274, - 145, 288, 378, 379, 1186, 380, 956, 968, -633, 1201, - 891, 384, 961, 1152, 966, 386, 387, 731, 40, 682, - 389, 390, 850, 948, 246, 392, 393, 951, 5, 5, - 627, 1050, 19, 398, 144, 329, 330, 401, 704, 903, - 403, 903, 661, 5, 447, 903, 560, 405, 1116, 408, - 409, 411, 412, 414, 1138, 415, 707, 34, 2, 7, - 600, 315, 316, 1117, 1119, 2, 426, 710, 4, 323, - 1158, 440, 137, 1282, 12, 4, 1111, 316, 708, 709, - 134, 228, 229, 459, 230, 231, 232, 233, 234, 476, - 5, 338, 481, 137, 340, 476, 341, 5, 822, 704, - 825, 491, 828, 5, 831, 493, 833, 587, 496, 588, - 145, 499, 24, 505, 246, 433, 508, 633, 735, 1093, - 5, 246, 346, 515, 21, 1312, 924, 709, 1162, 306, - 443, 442, 1163, 1164, 1165, 1192, 21, 463, 5, -30, - 527, 528, 807, 1312, 1310, 473, 903, 352, 533, 36, - 536, 1326, 483, 249, 537, 539, 540, 1343, 541, 687, - 1199, 36, 250, 694, 691, 664, 696, 868, 546, 665, - 547, 548, 1145, 549, 733, 551, 552, 1285, 554, 555, - 762, 556, 558, 693, 444, 326, 562, 563, 564, 689, - 1167, 374, 755, 19, 229, 757, 569, 570, 10, 301, - 573, 574, 531, 1223, 1224, 706, 707, 579, 580, 851, - 582, 583, 664, 585, 586, 5, 665, 1306, 34, 251, - 297, 296, 5, 596, 597, 598, 459, 317, 708, 709, - 603, 532, 604, 447, 607, 421, 608, 653, 655, 5, - 1182, 882, 654, 656, 1185, 614, 616, 1207, 704, 31, - 32, 7, 670, 675, 677, 1213, 1214, 671, 676, 678, - 751, 1181, 5, 5, 686, 652, 658, 458, 657, 1189, - 660, 696, 5, 662, 663, 1319, 973, 1312, 474, 475, - 975, 674, 517, 679, 978, 980, 981, 488, 521, 984, - 985, 1059, 685, 987, 495, 233, 234, 498, 688, 518, - 501, 690, 423, 154, 692, 156, 1316, 158, 511, 160, - 1333, 1333, 522, 1338, 1342, 698, 1347, 1347, 1269, 1351, - 1276, 424, 745, 1127, 10, 752, 185, 1128, 1129, 1130, - 1131, -51, 533, 588, 433, 533, 854, 537, 807, 759, - 908, 747, 670, 912, 1305, 251, 915, 671, 1162, 17, - 587, 1308, 1163, 1164, 1165, 805, 5, 764, 5, 286, - 1327, 1312, 765, 766, 767, 705, 768, 769, 771, 769, - 213, 214, 774, 628, 629, 31, 32, 1393, 889, 921, - 884, 696, 892, 588, 1397, 1132, 246, 433, 785, 786, - 788, 786, 477, 790, 1401, 791, 1101, 793, 1402, 795, - 708, 709, 490, 942, 709, 913, 502, 1060, 916, 228, - 1167, 469, 230, 231, 232, 804, 815, 859, 860, 861, - 1085, 1086, 1087, 1088, 855, 856, 857, 418, 816, 1169, - 818, 864, 1179, 821, 971, 824, 1183, 827, 897, 830, - 1188, 830, 421, 967, 598, 883, 900, 836, 875, 5, - 1346, 1346, 604, 604, 901, 608, 1069, 1070, 704, 844, - 991, 992, 706, 707, 847, 1162, 1101, 696, 892, 1163, - 1164, 1165, 1166, 839, 840, 5, -59, 852, 1099, 1100, - 807, -59, -59, -59, 704, 708, 709, 705, 706, 707, - 1038, 612, 1125, 1041, 1225, 1290, 1043, 869, 1044, 869, - 1156, 1206, 1045, 134, 228, 684, 1209, 230, 231, 232, - 1284, 708, 709, 710, 1162, 1106, 1184, 1334, 1163, 1164, - 1165, 1348, 1341, 807, 5, 43, 758, 1167, 1327, 1312, - 1016, 1016, 287, 622, 933, 165, 904, 166, 167, 909, - 168, 862, 1033, 1054, 866, 169, 1020, 1168, 919, 566, - 280, 618, 281, 170, 679, 623, 171, 679, 872, 807, - 683, 878, 1278, 502, 759, 1046, 844, 1048, 460, 462, - 172, 173, 465, 466, 666, 769, 1167, 174, 507, 769, - 175, 952, 1078, 954, 955, 786, 487, 268, 958, 896, - 269, 786, 699, 494, 962, 791, 497, 700, 701, 500, - 1118, 1120, 1121, 1122, 702, 176, 421, 510, 177, 696, - 178, 830, 179, 974, 1101, 830, 728, 180, 181, 977, - 979, 830, 728, 5, 983, 830, 728, 986, 830, 1420, - 988, 835, 704, 989, 98, 705, 706, 707, 836, 836, - 993, 406, 608, 228, 997, 998, 230, 231, 232, 233, - 234, 805, 1113, 806, 1001, 1003, 410, 101, 104, 708, - 709, 710, 1321, 1321, 1329, 1329, 413, 1336, 1123, 1321, - 1403, 1162, 1193, 1194, 1195, 1163, 1164, 1165, 1004, 0, - 5, 5, 0, 0, 1319, 0, 1312, 5, 696, 704, - 0, 0, 705, 706, 707, 0, 704, 0, 0, 228, - 229, 707, 230, 231, 232, 1051, 736, 0, 747, 0, - 0, 0, 0, 1058, 1056, 0, 708, 709, 710, 1064, - 1065, 1066, 1067, 708, 709, 1016, 952, 952, 0, 0, - 0, 1392, 0, 1167, 1395, 1281, 1196, 0, 1396, 0, - 0, 1399, 0, 0, 1077, 1400, 0, 0, 0, 0, - 0, 1081, 1082, 1083, 0, 1084, 830, 830, 830, 0, - 1089, 0, 1090, 476, 0, 0, 608, 0, 1095, 0, - 844, 5, 0, 0, 1001, 1001, 1419, 0, 0, 0, - 704, 1421, 0, 705, 706, 707, 0, 863, 0, 0, - 0, 869, 735, 0, 1016, 228, 923, 736, 230, 231, - 232, 233, 234, 0, 873, 806, 1022, 708, 709, 710, - 1023, 1024, 1025, 0, 679, 1139, 5, 1142, 0, 608, - 1146, 0, 0, 0, 1149, 1150, 0, 0, 0, 1153, - 1154, 0, 1155, 0, 898, 830, 902, 1157, 0, 902, - 0, 0, 902, 0, 0, 902, 844, 0, 902, 0, - 0, 1161, 0, 0, 728, 0, 0, 1177, 0, 0, - 1177, 0, 934, 1162, 1177, 1016, 0, 1163, 1164, 1165, - 1166, 0, 0, 5, 0, 869, 0, 0, 0, 0, - 0, 0, 704, 0, 0, 705, 706, 707, 0, 1204, - 0, 1205, 1187, 1142, 608, 1208, 0, 1146, 1210, 0, - 0, 0, 1212, 608, 0, 1216, 0, 0, 0, 708, - 709, 710, 1218, 1220, 0, 141, 0, 0, 869, 869, - 150, 0, 153, 0, 155, 1167, 157, 476, 159, 0, - 0, 1279, 0, 1391, 0, 5, 1289, 1218, 0, 0, - 0, 0, 0, 1394, 704, 1168, 0, 705, 706, 707, - 1398, 0, 0, 0, 0, 0, 735, 0, 0, 228, - 229, 736, 230, 231, 232, 233, 234, 0, 0, 806, - 1012, 708, 709, 710, 0, 1291, 1293, 1294, 1295, 1296, - 1026, 0, 1298, 1299, 1300, 1301, 1302, 0, 0, 1304, - 0, 608, 0, 844, 0, 902, 0, 902, 608, 228, - 229, 902, 230, 231, 232, 233, 234, 0, 0, 0, - 110, 728, 0, 0, 0, 0, 0, 111, 112, 728, - 113, 0, 0, 116, 0, 117, 0, 118, 0, 1357, - 0, 119, 0, 120, 0, 121, 1362, 122, 1365, 123, - 0, 124, 0, 125, 1369, 126, 1372, 0, 0, 0, - 0, 1376, 0, 127, 1379, 0, 0, 0, 0, 1383, - 128, 0, 129, 0, 130, 0, 131, 0, 132, 1162, - 133, 0, 0, 1163, 1164, 1165, 1166, 0, 0, 5, - 0, 0, 0, 0, 0, 5, 0, 0, 704, 0, - 0, 705, 706, 707, 704, 0, 0, 705, 706, 707, - 0, 1220, 902, 0, 0, 0, 1407, 1409, 0, 0, - 1412, 736, 197, 1, 2, 708, 709, 710, 0, 3, - 0, 708, 709, 710, 4, 0, 5, 6, 0, 0, - 0, 1167, 0, 7, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 9, 10, 0, 11, 0, 12, 0, - 0, 1168, 0, 13, 0, 14, 227, 728, 15, 0, - 728, 16, 476, 0, 728, 0, 0, 0, 728, 17, - 5, 0, 18, 0, 19, 20, 21, 22, 0, 704, - 0, 0, 705, 706, 707, 23, 24, 0, 25, 26, - 27, 735, 28, 29, 30, 31, 32, 33, 0, 34, - 35, 36, 0, 5, 0, 0, 708, 709, 710, 0, - 0, 0, 704, 355, 0, 705, 706, 707, 356, 0, - 358, 0, 728, 360, 361, 0, 0, 0, 0, 0, - 728, 0, 0, 0, 0, 5, 0, 0, 728, 708, - 709, 710, 0, 0, 704, 372, 373, 705, 706, 707, - 376, 0, 0, 377, 1187, 0, 0, 0, 0, 0, - 381, 0, 0, 0, 385, 0, 0, 0, 0, 388, - 0, 708, 709, 710, 391, 0, 0, 0, 0, 394, - 0, 0, 0, 0, 397, 0, 400, 134, 228, 229, - 402, 230, 231, 232, 233, 234, 0, 404, 0, 0, - 407, 0, 0, 0, 0, 0, 0, 0, 416, 1313, - 0, 1320, 1320, 1328, 1328, 0, 1335, 1339, 1320, 1344, - 1344, 0, 1349, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, - 0, 0, 0, 0, 0, 704, 8, 0, 705, 706, - 707, 0, 0, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 305, 14, 310, 0, 0, 322, - 0, 16, 708, 709, 710, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 20, 0, 22, 0, 3, - 0, 0, 0, 0, 529, 0, 530, 6, 25, 0, - 27, 535, 28, 0, 30, 0, 8, 0, 0, 0, - 35, 543, 0, 9, 0, 3, 11, 0, 544, 0, - 0, 0, 0, 6, 0, 0, 550, 0, 0, 0, - 0, 16, 8, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 18, 0, 567, 20, 0, 22, 0, 0, - 571, 14, 0, 0, 0, 0, 0, 16, 25, 0, - 27, 0, 28, 0, 30, 0, 0, 0, 18, 0, - 35, 20, 0, 22, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 0, 25, 606, 27, 0, 28, 610, - 30, 0, 0, 0, 0, 0, 35, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 432, 0, 438, 439, 635, 636, 637, 638, 639, 640, - 641, 642, 643, 644, 645, 646, 647, 648, 0, 472, - 0, 0, 0, 0, 480, 1263, 1226, 1227, 1228, 1229, - 1230, 1231, 1232, 1264, 1233, 1234, 1235, 1236, 1237, 1238, - 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, - 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1265, 1266, - 1257, 1258, 1259, 1260, 1261, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 761, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 553, 0, 395, 396, 0, 399, 0, - 561, 0, 0, 781, 0, 0, 0, 0, 783, 0, - 0, 0, 0, 0, 0, 572, 0, 0, 0, 0, + 115, 236, 270, 672, 61, 344, 479, 146, 532, 337, + 57, 842, 339, 347, 291, 187, 188, 945, 531, 312, + 302, 711, 929, 1022, 326, 307, 434, 737, 519, 932, + 190, 54, 934, 45, 907, 1104, 871, 911, 906, 485, + 613, 972, 789, 803, 808, 697, 1, 1171, 918, 349, + 926, 205, 512, 207, 925, 1119, 772, 1110, 1327, 1110, + 1115, 2, 464, 144, 144, 144, 822, 2, 825, 15, + 828, 4, 831, 447, 833, 5, 114, 4, 5, 192, + 1, 193, 1179, 194, 195, 5, 196, 704, 19, 106, + 1325, 1, 198, 199, 301, 200, 201, 202, 204, 202, + 206, 202, 208, 209, 134, 211, 249, 212, 33, 1179, + 518, 189, 5, 34, 40, 250, 710, 338, 189, 421, + 340, 267, 26, 246, 1403, 1193, 29, 216, 266, 217, + 220, 223, 251, 226, 289, -632, 17, 1059, 1060, 145, + 145, 145, 421, 251, 1115, 5, 15, 17, 21, 333, + 899, 19, 903, 306, 704, 903, 26, 1181, 903, 425, + 29, 903, -634, 333, 903, 2, 5, 26, 1018, 370, + 311, 29, 1017, 36, 467, 4, 34, 345, 706, 707, + 908, 1057, 709, 912, 1181, 33, 915, 1084, 350, 1044, + 352, 484, 1046, 1043, 525, 246, 996, 357, 998, 359, + 316, 708, 709, 362, 363, 1300, 282, 1054, -635, 364, + 365, 366, 367, 626, 368, 326, 369, 202, 371, 1066, + 734, 246, 433, 1101, 1366, 1199, 1103, 374, 283, 274, + 485, 1122, 378, 379, 288, 380, 958, 627, -636, 968, + 970, 384, 963, 682, 975, 386, 387, 731, 977, 661, + 389, 390, 980, 982, 983, 392, 393, 986, 987, 924, + 891, 989, 950, 398, 850, 21, 953, 401, 1134, 1162, + 403, 7, 1135, 1136, 1137, 1138, 560, 405, 5, 408, + 409, 411, 412, 414, 600, 415, 12, 144, 670, 422, + 36, 442, 5, 671, 476, 459, 1147, 1296, 5, 1124, + 1126, 704, 5, 1123, 1168, 323, 338, 1170, 249, 340, + 1213, 1214, 483, 903, 10, 903, 297, 250, 5, 903, + 859, 860, 861, 317, 24, 5, 1098, 704, 708, 709, + 1139, 706, 707, 1118, 341, 1045, 5, 1175, 1047, 502, + 1048, 1176, 1177, 1178, 1049, 704, 513, 5, 883, 1194, + 493, 1340, 1325, 496, 708, 709, 499, 1202, 315, 316, + 526, 476, 10, 145, 346, 31, 32, 443, 1323, 5, + 527, 528, -30, 5, 463, 473, 1205, 352, 533, 296, + 536, 229, 1155, 251, 537, 539, 540, 687, 541, 444, + 735, 868, 1090, 1091, 1092, 1093, 689, 693, 546, 1180, + 547, 548, 691, 549, 762, 551, 552, 459, 554, 555, + 326, 556, 558, 31, 32, 5, 562, 563, 564, 1299, + 5, 374, 1211, 903, 704, 1325, 569, 570, 1064, 707, + 573, 574, 664, 851, 670, 531, 665, 579, 580, 671, + 582, 583, 5, 585, 586, 1125, 1127, 1128, 1129, 213, + 214, 708, 709, 596, 597, 598, 532, 134, 1319, 931, + 603, 707, 604, 1220, 607, 882, 608, 7, 1237, 1238, + 807, 1226, 1227, 654, 656, 1166, 755, 670, 447, 757, + 653, 655, 671, 708, 709, 633, 5, 5, 477, 676, + 678, 423, 424, 518, 751, 1134, 675, 677, 490, 1135, + 1136, 1137, 1138, 1339, 664, 424, 517, 686, 665, 1356, + 652, 5, 521, 657, 1332, 660, 1325, 1195, 662, 663, + 522, 1198, 1206, 1207, 1208, 5, 674, 107, 108, 1340, + 1325, 694, 329, 330, 696, 1026, 587, 685, 588, 1027, + 1028, 1029, 733, 688, 423, 5, 690, 433, 1175, 692, + 233, 234, 1176, 1177, 1178, 752, 747, 1139, 5, 805, + 698, 1318, 533, 421, -51, 533, 588, 537, 1321, 759, + 921, -59, 1182, 628, 629, 1192, -59, -59, -59, 1196, + 1175, 246, 433, 1201, 1176, 1177, 1178, 764, 1295, 134, + 5, 1146, 765, 766, 767, 1325, 768, 769, 771, 769, + 708, 709, 774, 855, 856, 857, 134, 228, 884, 229, + 1180, 230, 231, 232, 233, 234, 587, 141, 785, 786, + 788, 786, 150, 790, 153, 791, 155, 793, 157, 795, + 159, 1283, 705, 1290, 588, 913, 944, 1065, 916, 696, + 1239, 1108, 1180, 709, 1175, 469, 815, 618, 1176, 1177, + 1178, 623, 1359, 1359, 5, 418, 1298, 1332, 816, 1325, + 818, 864, 804, 821, 973, 824, 807, 827, 969, 830, + 666, 830, 1074, 1075, 598, 228, 897, 836, 875, 230, + 231, 232, 604, 604, 154, 608, 156, 900, 158, 844, + 160, 228, 993, 994, 847, 230, 231, 232, 233, 234, + 805, 901, 806, 1042, 854, 612, 1180, 1132, 1334, 1334, + 1342, 1342, 728, 1349, 1303, 1334, 839, 840, 728, 1219, + 1175, 1108, 728, 684, 1176, 1177, 1178, 1179, 1106, 1107, + 5, 134, 228, 1222, 10, 1113, 230, 231, 232, 704, + 1347, 1197, 705, 706, 707, 1361, 889, 1354, 43, 696, + 892, 287, 228, 758, 229, 251, 230, 231, 232, 17, + 622, 935, 1020, 1020, 165, 166, 708, 709, 710, 286, + 167, 168, 421, 421, 502, 1058, 169, 1405, 862, 280, + 1408, 866, 1180, 1024, 1409, 31, 32, 1412, 170, 281, + 566, 1413, 171, 683, 759, 872, 844, 1050, 878, 1052, + 1292, 172, 1181, 173, 174, 769, 1143, 507, 175, 769, + 1083, 954, 807, 956, 957, 786, 268, 269, 960, 896, + 176, 786, 1432, 699, 964, 791, 228, 1434, 229, 700, + 230, 231, 232, 233, 234, 696, 892, 806, 177, 701, + 702, 830, 835, 976, 476, 830, 178, 179, 180, 979, + 981, 830, 5, 181, 985, 830, 807, 988, 830, 98, + 990, 704, 410, 991, 705, 706, 707, 1433, 836, 836, + 995, 406, 608, 735, 999, 1000, 101, 1002, 736, 413, + 1416, 104, 1008, 863, 0, 0, 1005, 1007, 708, 709, + 710, 1329, 0, 0, 807, 1346, 1346, 0, 1351, 1355, + 873, 1360, 1360, 1130, 1364, 0, 0, 458, 0, 228, + 0, 0, 1037, 230, 231, 232, 233, 234, 474, 475, + 806, 0, 0, 0, 0, 0, 0, 488, 0, 0, + 898, 0, 902, 502, 495, 902, 0, 498, 902, 0, + 501, 902, 0, 0, 902, 421, 421, 1063, 511, 0, + 728, 0, 0, 1069, 1070, 1071, 1072, 0, 936, 0, + 954, 954, 1406, 0, 0, 1020, 228, 0, 229, 1410, + 230, 231, 232, 233, 234, 0, 1209, 0, 1082, 1414, + 0, 696, 0, 1415, 0, 1086, 1087, 1088, 0, 1089, + 830, 830, 830, 0, 1094, 0, 1095, 1108, 0, 0, + 608, 0, 1100, 1102, 0, 844, 5, 0, 0, 1005, + 1005, 0, 0, 0, 0, 704, 0, 0, 705, 706, + 707, 134, 228, 3, 229, 1120, 230, 231, 232, 233, + 234, 6, 0, 0, 0, 0, 0, 1020, 0, 0, + 8, 0, 708, 709, 710, 0, 0, 9, 0, 0, + 11, 0, 1149, 0, 1152, 0, 608, 1156, 0, 0, + 0, 1159, 1160, 696, 0, 16, 1163, 1164, 1016, 1165, + 0, 0, 830, 0, 1167, 0, 18, 0, 1030, 20, + 0, 22, 0, 844, 0, 0, 844, 0, 0, 1172, + 1173, 0, 25, 902, 27, 902, 28, 0, 30, 902, + 0, 0, 0, 0, 35, 0, 0, 0, 1020, 728, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 728, + 1175, 0, 0, 0, 1176, 1177, 1178, 1179, 0, 0, + 5, 0, 1217, 0, 1218, 0, 1152, 608, 1221, 704, + 1156, 1223, 705, 706, 707, 1225, 608, 0, 1229, 1200, + 0, 0, 0, 0, 1231, 1233, 0, 0, 0, 460, + 462, 0, 0, 465, 466, 0, 708, 709, 710, 0, + 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, + 1302, 1231, 1180, 0, 494, 0, 1407, 497, 0, 0, + 500, 0, 0, 1411, 0, 0, 0, 0, 510, 0, + 0, 0, 1181, 902, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 936, 0, 0, 0, 0, 1304, + 1306, 1307, 1308, 1309, 0, 0, 1311, 1312, 1313, 1314, + 1315, 476, 0, 1317, 0, 608, 0, 844, 0, 5, + 0, 0, 608, 0, 0, 0, 0, 0, 704, 0, + 0, 705, 706, 707, 0, 0, 0, 0, 0, 0, + 735, 0, 0, 728, 923, 736, 728, 0, 0, 0, + 728, 0, 1370, 0, 728, 708, 709, 710, 110, 1375, + 0, 1378, 0, 0, 0, 111, 112, 1382, 113, 1385, + 0, 116, 0, 117, 1389, 118, 0, 1392, 0, 119, + 0, 120, 1396, 121, 0, 122, 0, 123, 0, 124, + 0, 125, 0, 126, 1404, 0, 0, 0, 0, 0, + 0, 127, 0, 0, 0, 0, 0, 0, 128, 0, + 129, 728, 130, 0, 131, 0, 132, 0, 133, 728, + 0, 0, 0, 0, 1233, 0, 0, 728, 0, 1420, + 1422, 0, 0, 1425, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 197, 0, 135, 137, 139, 139, 142, 0, 0, 148, + 139, 151, 139, 148, 139, 148, 139, 148, 139, 148, + 161, 163, 0, 185, 185, 185, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1326, 0, + 1333, 1333, 1341, 1341, 227, 1348, 1352, 1333, 1357, 1357, + 0, 1362, 300, 0, 305, 0, 310, 1175, 0, 322, + 0, 1176, 1177, 1178, 1179, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 3, 0, 704, 0, 0, 705, + 706, 707, 6, 0, 0, 244, 0, 0, 0, 0, + 272, 8, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 355, 0, 708, 709, 710, 356, 0, 358, 0, + 14, 360, 361, 0, 0, 0, 16, 0, 0, 1180, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 20, 0, 22, 372, 373, 0, 0, 0, 376, 1181, + 0, 377, 0, 25, 0, 27, 0, 28, 381, 30, + 0, 0, 385, 0, 0, 35, 0, 388, 0, 0, + 476, 0, 391, 0, 0, 0, 0, 394, 5, 0, + 0, 0, 397, 0, 400, 0, 0, 704, 402, 0, + 705, 706, 707, 0, 0, 404, 0, 0, 407, 735, + 0, 0, 0, 417, 0, 0, 416, 0, 0, 5, + 432, 0, 438, 439, 708, 709, 710, 0, 704, 0, + 3, 705, 706, 707, 0, 0, 0, 5, 6, 472, + 0, 0, 0, 0, 480, 736, 704, 8, 0, 705, + 706, 707, 0, 0, 9, 708, 709, 710, 0, 0, + 0, 0, 0, 426, 0, 0, 14, 0, 440, 137, + 0, 0, 16, 708, 709, 710, 0, 0, 0, 0, + 0, 0, 0, 18, 0, 0, 20, 0, 22, 481, + 137, 0, 0, 0, 0, 0, 0, 0, 491, 25, + 0, 27, 529, 28, 530, 30, 0, 0, 0, 535, + 505, 35, 0, 508, 0, 0, 0, 0, 0, 543, + 515, 0, 0, 545, 0, 0, 544, 0, 0, 0, + 0, 0, 0, 553, 550, 5, 0, 0, 0, 0, + 561, 0, 0, 0, 704, 0, 0, 705, 706, 707, + 0, 0, 567, 0, 1200, 572, 0, 0, 571, 0, 0, 577, 578, 0, 0, 581, 0, 0, 584, 0, - 0, 0, 0, 0, 0, 593, 0, 0, 595, 0, - 0, 0, 0, 601, 0, 602, 0, 0, 0, 0, - 0, 817, 0, 820, 611, 0, 823, 0, 826, 0, - 829, 0, 832, 0, 0, 834, 0, 625, 0, 0, - 0, 632, 0, 838, 0, 0, 841, 0, 843, 0, - 0, 0, 0, 846, 0, 0, 669, 0, 0, 0, + 0, 708, 709, 710, 0, 593, 0, 5, 595, 0, + 0, 0, 0, 601, 0, 602, 704, 5, 0, 705, + 706, 707, 0, 606, 611, 0, 704, 610, 0, 705, + 706, 707, 0, 736, 0, 747, 0, 625, 0, 0, + 0, 632, 0, 708, 709, 710, 0, 0, 0, 0, + 0, 0, 0, 708, 709, 710, 669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 681, 0, 0, + 0, 0, 614, 616, 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, 732, 0, + 0, 0, 0, 658, 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, 744, 0, 0, 0, 750, 0, - 0, 0, 0, 0, 753, 0, 754, 559, 0, 0, - 756, 0, 0, 0, 0, 565, 760, 0, 0, 0, - 568, 0, 0, 763, 0, 0, 0, 575, 576, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 594, 773, 0, 0, 775, + 679, 0, 0, 0, 753, 0, 754, 0, 0, 0, + 756, 0, 0, 0, 0, 0, 760, 0, 0, 0, + 0, 0, 0, 763, 761, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 745, + 0, 0, 0, 185, 0, 0, 773, 0, 0, 775, 776, 777, 778, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 784, 0, 0, 0, 0, 0, 0, - 0, 0, 792, 0, 794, 0, 0, 797, 0, 799, + 0, 781, 0, 784, 0, 0, 783, 0, 395, 396, + 0, 399, 792, 0, 794, 0, 0, 797, 0, 799, 0, 801, 0, 0, 0, 0, 0, 814, 0, 0, - 1226, 1227, 1228, 1229, 1230, 1231, 1232, 0, 1233, 1234, - 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, - 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, - 1255, 1256, 0, 995, 1257, 1258, 1259, 1260, 1261, 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, 817, + 0, 820, 0, 0, 823, 0, 826, 0, 829, 0, + 832, 0, 0, 834, 0, 0, 0, 0, 0, 0, + 0, 838, 0, 0, 841, 0, 843, 0, 0, 0, + 0, 846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 865, 0, 867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 877, 0, 879, 0, 0, 0, 0, 0, 0, 885, 0, 886, 0, 887, - 0, 888, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 779, 780, 0, 0, 0, 0, - 782, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1075, 0, 796, 930, 798, 0, 800, - 0, 802, 0, 0, 935, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1098, 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, - 0, 0, 1137, 0, 976, 0, 0, 0, 1141, 982, - 1144, 0, 0, 1148, 0, 0, 0, 0, 0, 0, - 0, 990, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 999, 0, 0, 0, 0, 0, 0, 1000, - 1159, 0, 1005, 1006, 1007, 1008, 1009, 1010, 0, 0, - 1011, 0, 1015, 0, 0, 1019, 0, 0, 0, 0, - 1021, 0, 1030, 1031, 1032, 0, 0, 0, 0, 0, - 0, 1036, 0, 0, 0, 0, 0, 0, 1202, 0, - 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1215, 0, 0, 0, - 0, 1063, 0, 0, 0, 0, 944, 945, 946, 947, - 0, 949, 950, 0, 0, 0, 0, 0, 0, 0, - 0, 957, 0, 959, 960, 0, 0, 0, 0, 0, - 0, 964, 965, 0, 0, 0, 1080, 0, 0, 0, - 0, 0, 0, 0, 972, 0, 0, 0, 0, 0, - 0, 1092, 0, 1094, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1109, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1126, 1309, 0, 0, 0, 1136, 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, 1359, 0, 0, 0, 0, 0, 0, 1364, - 0, 0, 0, 0, 0, 0, 0, 1371, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1198, 0, 1200, - 1068, 0, 0, 0, 0, 1071, 1072, 0, 1073, 0, - 0, 0, 0, 0, 1074, 0, 0, 1076, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1217, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1277, 0, 0, 0, 0, 0, 0, 0, 1283, 0, - 1287, 1288, 1270, 1226, 1227, 1228, 1229, 1230, 1231, 1232, - 1271, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, - 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, - 1252, 1253, 1254, 1255, 1256, 1272, 1273, 1257, 1258, 1259, - 1260, 1261, 0, 0, 0, 0, 1297, 0, 0, 0, - 0, 0, 0, 1303, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1311, - 0, 1318, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1352, 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, 1211, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1222, - 0, 0, 1388, 1389, 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, 0, 0, - 1405, 0, 0, 0, 0, 0, 0, 1414, 0, 0, + 0, 888, 0, 0, 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1423, + 0, 0, 0, 0, 869, 0, 869, 0, 0, 0, + 559, 0, 0, 0, 0, 0, 930, 0, 565, 0, + 0, 0, 0, 568, 937, 0, 0, 0, 0, 0, + 575, 576, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 904, 0, 0, 909, 0, 594, 0, + 0, 0, 0, 0, 0, 919, 0, 0, 0, 0, + 0, 679, 0, 0, 679, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 978, 0, 0, 0, 0, 984, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 992, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 997, 1001, 0, 1003, 0, 0, 0, 0, 0, + 0, 1004, 0, 0, 1009, 1010, 1011, 1012, 1013, 1014, + 0, 0, 1015, 0, 1019, 0, 0, 1023, 0, 0, + 0, 0, 1025, 0, 1034, 1035, 1036, 0, 0, 0, + 0, 0, 0, 1040, 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, 1068, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 779, 780, 0, + 0, 0, 0, 782, 1055, 1080, 0, 0, 0, 0, + 1085, 0, 0, 0, 0, 1061, 0, 0, 796, 0, + 798, 0, 800, 0, 802, 1097, 0, 1099, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1105, 0, + 0, 0, 0, 0, 0, 1116, 1117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1133, 0, 0, 0, 0, + 0, 0, 1144, 0, 0, 0, 0, 1145, 0, 0, + 0, 0, 0, 1151, 0, 1154, 0, 0, 1158, 0, + 0, 0, 0, 869, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1169, 0, 1174, 679, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1212, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1215, + 0, 1216, 0, 0, 1190, 0, 0, 1190, 0, 0, + 0, 1190, 0, 0, 0, 0, 0, 1228, 0, 1230, + 0, 0, 869, 0, 0, 0, 0, 0, 0, 946, + 947, 948, 949, 1291, 951, 952, 0, 0, 0, 0, + 0, 1297, 0, 1301, 959, 0, 961, 962, 0, 0, + 0, 0, 0, 0, 966, 967, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 974, 869, 869, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, + 1310, 0, 0, 0, 0, 0, 0, 1316, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1324, 1322, 1331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1365, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1372, 0, 0, 0, 0, 0, 0, + 1377, 0, 0, 0, 0, 0, 0, 0, 1384, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1401, 1402, 1, 2, 0, + 0, 0, 0, 3, 0, 0, 0, 1073, 4, 0, + 5, 6, 1076, 1077, 0, 1078, 0, 7, 0, 0, + 8, 1079, 0, 0, 1081, 0, 0, 9, 10, 0, + 11, 0, 12, 1418, 0, 0, 0, 13, 0, 14, + 1427, 0, 15, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 18, 0, 19, 20, + 21, 22, 1436, 0, 0, 0, 0, 0, 0, 23, + 24, 0, 25, 26, 27, 0, 28, 29, 30, 31, + 32, 33, 0, 34, 35, 36, 1277, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1278, 1247, 1248, 1249, 1250, 1251, + 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1279, + 1280, 1271, 1272, 1273, 1274, 1275, 1284, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1285, 1247, 1248, 1249, 1250, 1251, + 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1286, + 1287, 1271, 1272, 1273, 1274, 1275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1224, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1235, 1236, 1240, 1241, 1242, 1243, + 1244, 1245, 1246, 0, 1247, 1248, 1249, 1250, 1251, 1252, + 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, + 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 0, 0, + 1271, 1272, 1273, 1274, 1275, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 1320, 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, 1367, 0, 0, 1368, 1369, 0, + 1371, 0, 0, 0, 1373, 1374, 0, 1376, 0, 1379, + 0, 0, 1380, 1381, 0, 1383, 0, 1386, 0, 1387, + 1388, 0, 1390, 1391, 0, 1393, 1394, 0, 1395, 0, + 1397, 1398, 0, 1399, 0, 1400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1307, 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, 1354, 0, - 0, 1355, 1356, 0, 1358, 0, 0, 0, 1360, 1361, - 0, 1363, 0, 1366, 0, 0, 1367, 1368, 0, 1370, - 0, 1373, 0, 1374, 1375, 0, 1377, 1378, 0, 1380, - 1381, 0, 1382, 0, 1384, 1385, 0, 1386, 0, 1387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1417, 0, 1419, 1421, 0, 1423, + 1424, 1426, 0, 1428, 1429, 1430, 1431, 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, 1404, 0, - 1406, 1408, 0, 1410, 1411, 1413, 0, 1415, 1416, 1417, - 1418, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1422, 0, 1424 + 0, 0, 0, 1435, 0, 1437 }; static const yytype_int16 yycheck[] = { - 57, 192, 196, 0, 0, 227, 220, 115, 558, 223, - 374, 131, 132, 434, 783, 434, 201, 206, 821, 242, - 853, 346, 893, 836, 838, 592, 1137, 841, 528, 212, - 0, 0, 352, 821, 411, 208, 824, 379, 742, 235, - 955, 697, 678, 204, 369, 133, 836, 656, 694, 243, - 836, 1058, 403, 159, 160, 109, 110, 111, 112, 113, - 4, 6, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 997, 130, 131, 132, 136, - 1291, 138, 1077, 140, 141, 365, 143, 156, 1064, 158, - 1066, 1067, 149, 150, 0, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 832, 162, 14, 164, 816, 17, - 818, 4, 147, 821, 22, 195, 824, 35, 598, 827, - 195, 201, 830, 25, 604, 14, 4, 184, 17, 186, - 187, 188, 220, 190, 49, 223, 80, 82, 192, 40, - 84, 19, 5, 197, 49, 6, 1357, 1142, 17, 163, - 28, 347, 15, 3, 6, 7, 17, 26, 73, 350, - 12, 40, 952, 56, 1035, 17, 952, 60, 86, 87, - 1146, 974, 163, 88, 368, 25, 78, 78, 56, 163, - 993, 89, 60, 88, 53, 54, 974, 80, 245, 977, - 247, 84, 163, 378, 416, 32, 33, 254, 1309, 256, - 89, 397, 80, 260, 261, 274, 84, 1078, 404, 266, - 267, 268, 269, 1220, 271, 1001, 273, 274, 275, 539, - 403, 82, 418, 927, 1057, 929, 603, 284, 570, 198, - 82, 201, 289, 290, 1149, 292, 872, 893, 163, 1161, - 807, 298, 878, 1114, 890, 302, 303, 598, 0, 569, - 307, 308, 752, 862, 61, 312, 313, 866, 17, 17, - 540, 989, 65, 320, 6, 74, 75, 324, 26, 977, - 327, 979, 552, 17, 16, 983, 470, 334, 1081, 336, - 337, 338, 339, 340, 1098, 342, 31, 90, 5, 24, - 513, 50, 51, 1081, 1082, 5, 350, 55, 15, 64, - 1133, 355, 356, 1218, 39, 15, 1075, 51, 53, 54, - 147, 148, 149, 48, 151, 152, 153, 154, 155, 9, - 17, 409, 376, 377, 412, 9, 41, 17, 720, 26, - 722, 385, 724, 17, 726, 386, 728, 155, 389, 157, - 82, 392, 77, 397, 61, 62, 400, 543, 38, 1053, - 17, 61, 150, 407, 67, 22, 836, 54, 7, 72, - 357, 356, 11, 12, 13, 1153, 67, 364, 17, 150, - 427, 428, 697, 22, 1289, 371, 1084, 434, 435, 92, - 437, 1294, 377, 19, 441, 442, 443, 1300, 445, 574, - 1159, 92, 28, 589, 583, 7, 592, 774, 455, 11, - 457, 458, 1106, 460, 600, 462, 463, 1220, 465, 466, - 633, 468, 469, 586, 57, 598, 473, 474, 475, 580, - 69, 478, 619, 65, 149, 622, 483, 484, 35, 71, - 487, 488, 851, 1202, 1203, 30, 31, 494, 495, 759, - 497, 498, 7, 500, 501, 17, 11, 1280, 90, 56, - 202, 23, 17, 510, 511, 512, 48, 209, 53, 54, - 517, 882, 519, 16, 521, 790, 523, 547, 548, 17, - 1144, 791, 547, 548, 1148, 529, 530, 1181, 26, 86, - 87, 24, 7, 563, 564, 1189, 1190, 12, 563, 564, - 610, 1142, 17, 17, 574, 546, 550, 361, 549, 1150, - 551, 697, 17, 554, 555, 20, 898, 22, 372, 373, - 902, 562, 408, 567, 906, 907, 908, 381, 414, 911, - 912, 1001, 573, 915, 388, 154, 155, 391, 579, 25, - 394, 582, 32, 120, 585, 122, 1291, 124, 402, 126, - 1295, 1296, 47, 1298, 1299, 596, 1301, 1302, 1208, 1304, - 1210, 33, 606, 7, 35, 612, 610, 11, 12, 13, - 14, 155, 619, 157, 62, 622, 762, 624, 893, 626, - 821, 45, 7, 824, 1278, 56, 827, 12, 7, 60, - 155, 1285, 11, 12, 13, 156, 17, 644, 17, 70, - 21, 22, 649, 650, 651, 29, 653, 654, 655, 656, - 161, 162, 659, 58, 59, 86, 87, 1362, 804, 147, - 795, 807, 808, 157, 1369, 69, 61, 62, 675, 676, - 677, 678, 374, 680, 1379, 682, 8, 684, 1383, 686, - 53, 54, 384, 847, 54, 826, 832, 1001, 829, 148, - 69, 369, 151, 152, 153, 695, 703, 765, 766, 767, - 1042, 1043, 1044, 1045, 151, 152, 153, 346, 715, 1139, - 717, 769, 1142, 720, 894, 722, 1146, 724, 816, 726, - 1150, 728, 997, 891, 731, 793, 817, 734, 786, 17, - 1301, 1302, 739, 740, 818, 742, 1013, 1014, 26, 746, - 925, 926, 30, 31, 751, 7, 8, 893, 894, 11, - 12, 13, 14, 739, 740, 17, 156, 761, 1061, 1062, - 1035, 161, 162, 163, 26, 53, 54, 29, 30, 31, - 974, 527, 1090, 974, 1204, 1224, 977, 781, 979, 783, - 1122, 1180, 983, 147, 148, 571, 1184, 151, 152, 153, - 1220, 53, 54, 55, 7, 1066, 1146, 1296, 11, 12, - 13, 1302, 1299, 1078, 17, 0, 624, 69, 21, 22, - 954, 955, 201, 536, 843, 129, 820, 129, 129, 823, - 129, 768, 968, 995, 771, 129, 958, 89, 832, 478, - 199, 533, 199, 129, 838, 537, 129, 841, 785, 1114, - 570, 788, 1212, 989, 851, 986, 853, 988, 362, 363, - 129, 129, 366, 367, 556, 862, 69, 129, 398, 866, - 129, 868, 1035, 870, 871, 872, 380, 195, 875, 815, - 195, 878, 597, 387, 881, 882, 390, 597, 597, 393, - 1081, 1082, 1083, 1084, 597, 129, 1161, 401, 129, 1035, - 129, 898, 129, 900, 8, 902, 598, 129, 129, 906, - 907, 908, 604, 17, 911, 912, 608, 914, 915, 1409, - 917, 731, 26, 920, 0, 29, 30, 31, 925, 926, - 927, 334, 929, 148, 931, 932, 151, 152, 153, 154, - 155, 156, 1078, 158, 941, 942, 337, 0, 0, 53, - 54, 55, 1293, 1294, 1295, 1296, 339, 1298, 1089, 1300, - 1388, 7, 1153, 1154, 1155, 11, 12, 13, 942, -1, - 17, 17, -1, -1, 20, -1, 22, 17, 1114, 26, - -1, -1, 29, 30, 31, -1, 26, -1, -1, 148, - 149, 31, 151, 152, 153, 989, 43, -1, 45, -1, - -1, -1, -1, 1000, 998, -1, 53, 54, 55, 1006, - 1007, 1008, 1009, 53, 54, 1149, 1013, 1014, -1, -1, - -1, 1362, -1, 69, 1365, 1216, 1157, -1, 1369, -1, - -1, 1372, -1, -1, 1031, 1376, -1, -1, -1, -1, - -1, 1038, 1039, 1040, -1, 1042, 1043, 1044, 1045, -1, - 1047, -1, 1049, 9, -1, -1, 1053, -1, 1055, -1, - 1057, 17, -1, -1, 1061, 1062, 1407, -1, -1, -1, - 26, 1412, -1, 29, 30, 31, -1, 769, -1, -1, - -1, 1075, 38, -1, 1218, 148, 42, 43, 151, 152, - 153, 154, 155, -1, 786, 158, 7, 53, 54, 55, - 11, 12, 13, -1, 1098, 1102, 17, 1104, -1, 1106, - 1107, -1, -1, -1, 1111, 1112, -1, -1, -1, 1116, - 1117, -1, 1119, -1, 816, 1122, 818, 1124, -1, 821, - -1, -1, 824, -1, -1, 827, 1133, -1, 830, -1, - -1, 1138, -1, -1, 836, -1, -1, 1141, -1, -1, - 1144, -1, 844, 7, 1148, 1289, -1, 11, 12, 13, - 14, -1, -1, 17, -1, 1159, -1, -1, -1, -1, - -1, -1, 26, -1, -1, 29, 30, 31, -1, 1176, - -1, 1178, 36, 1180, 1181, 1182, -1, 1184, 1185, -1, - -1, -1, 1189, 1190, -1, 1192, -1, -1, -1, 53, - 54, 55, 1199, 1200, -1, 112, -1, -1, 1202, 1203, - 117, -1, 119, -1, 121, 69, 123, 9, 125, -1, - -1, 1215, -1, 1359, -1, 17, 1223, 1224, -1, -1, - -1, -1, -1, 1364, 26, 89, -1, 29, 30, 31, - 1371, -1, -1, -1, -1, -1, 38, -1, -1, 148, - 149, 43, 151, 152, 153, 154, 155, -1, -1, 158, - 952, 53, 54, 55, -1, 1262, 1263, 1264, 1265, 1266, - 962, -1, 1269, 1270, 1271, 1272, 1273, -1, -1, 1276, - -1, 1278, -1, 1280, -1, 977, -1, 979, 1285, 148, - 149, 983, 151, 152, 153, 154, 155, -1, -1, -1, - 45, 993, -1, -1, -1, -1, -1, 52, 53, 1001, - 55, -1, -1, 58, -1, 60, -1, 62, -1, 1316, - -1, 66, -1, 68, -1, 70, 1323, 72, 1325, 74, - -1, 76, -1, 78, 1331, 80, 1333, -1, -1, -1, - -1, 1338, -1, 88, 1341, -1, -1, -1, -1, 1346, - 95, -1, 97, -1, 99, -1, 101, -1, 103, 7, - 105, -1, -1, 11, 12, 13, 14, -1, -1, 17, - -1, -1, -1, -1, -1, 17, -1, -1, 26, -1, - -1, 29, 30, 31, 26, -1, -1, 29, 30, 31, - -1, 1388, 1084, -1, -1, -1, 1393, 1394, -1, -1, - 1397, 43, 147, 4, 5, 53, 54, 55, -1, 10, - -1, 53, 54, 55, 15, -1, 17, 18, -1, -1, - -1, 69, -1, 24, -1, -1, 27, -1, -1, -1, - -1, -1, -1, 34, 35, -1, 37, -1, 39, -1, - -1, 89, -1, 44, -1, 46, 191, 1139, 49, -1, - 1142, 52, 9, -1, 1146, -1, -1, -1, 1150, 60, - 17, -1, 63, -1, 65, 66, 67, 68, -1, 26, - -1, -1, 29, 30, 31, 76, 77, -1, 79, 80, - 81, 38, 83, 84, 85, 86, 87, 88, -1, 90, - 91, 92, -1, 17, -1, -1, 53, 54, 55, -1, - -1, -1, 26, 248, -1, 29, 30, 31, 253, -1, - 255, -1, 1204, 258, 259, -1, -1, -1, -1, -1, - 1212, -1, -1, -1, -1, 17, -1, -1, 1220, 53, - 54, 55, -1, -1, 26, 280, 281, 29, 30, 31, - 285, -1, -1, 288, 36, -1, -1, -1, -1, -1, - 295, -1, -1, -1, 299, -1, -1, -1, -1, 304, - -1, 53, 54, 55, 309, -1, -1, -1, -1, 314, - -1, -1, -1, -1, 319, -1, 321, 147, 148, 149, - 325, 151, 152, 153, 154, 155, -1, 332, -1, -1, - 335, -1, -1, -1, -1, -1, -1, -1, 343, 1291, - -1, 1293, 1294, 1295, 1296, -1, 1298, 1299, 1300, 1301, - 1302, -1, 1304, -1, -1, -1, -1, -1, -1, 10, - -1, -1, -1, -1, -1, -1, 17, 18, -1, -1, - -1, -1, -1, -1, -1, 26, 27, -1, 29, 30, - 31, -1, -1, 34, -1, -1, -1, -1, -1, -1, - -1, -1, 203, -1, 205, 46, 207, -1, -1, 210, - -1, 52, 53, 54, 55, -1, -1, -1, -1, -1, - -1, -1, 63, -1, -1, 66, -1, 68, -1, 10, - -1, -1, -1, -1, 429, -1, 431, 18, 79, -1, - 81, 436, 83, -1, 85, -1, 27, -1, -1, -1, - 91, 446, -1, 34, -1, 10, 37, -1, 453, -1, - -1, -1, -1, 18, -1, -1, 461, -1, -1, -1, - -1, 52, 27, -1, -1, -1, -1, -1, -1, 34, - -1, -1, 63, -1, 479, 66, -1, 68, -1, -1, - 485, 46, -1, -1, -1, -1, -1, 52, 79, -1, - 81, -1, 83, -1, 85, -1, -1, -1, 63, -1, - 91, 66, -1, 68, 93, 94, 95, 96, 97, 98, - 99, 100, 101, -1, 79, 520, 81, -1, 83, 524, - 85, -1, -1, -1, -1, -1, 91, -1, -1, -1, - -1, -1, -1, 344, -1, -1, -1, -1, -1, -1, - 351, -1, 353, 354, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, -1, 370, - -1, -1, -1, -1, 375, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 631, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 454, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 464, -1, 317, 318, -1, 320, -1, - 471, -1, -1, 668, -1, -1, -1, -1, 673, -1, - -1, -1, -1, -1, -1, 486, -1, -1, -1, -1, + 57, 192, 196, 558, 0, 227, 374, 115, 434, 220, + 0, 742, 223, 242, 201, 131, 132, 853, 434, 208, + 204, 598, 836, 957, 212, 206, 352, 604, 411, 838, + 133, 0, 841, 0, 821, 1063, 783, 824, 821, 379, + 528, 893, 678, 694, 697, 592, 4, 1145, 832, 243, + 836, 156, 403, 158, 836, 1082, 656, 1069, 1304, 1071, + 1072, 5, 365, 6, 6, 6, 720, 5, 722, 49, + 724, 15, 726, 16, 728, 17, 164, 15, 17, 136, + 4, 138, 14, 140, 141, 17, 143, 26, 65, 0, + 22, 4, 149, 150, 71, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 147, 162, 19, 164, 88, 14, + 25, 40, 17, 90, 0, 28, 55, 220, 40, 346, + 223, 195, 80, 61, 1370, 1152, 84, 184, 195, 186, + 187, 188, 56, 190, 201, 164, 60, 999, 1000, 82, + 82, 82, 369, 56, 1156, 17, 49, 60, 67, 78, + 816, 65, 818, 72, 26, 821, 80, 89, 824, 350, + 84, 827, 164, 78, 830, 5, 17, 80, 954, 274, + 73, 84, 954, 92, 368, 15, 90, 235, 30, 31, + 821, 995, 54, 824, 89, 88, 827, 1039, 245, 976, + 247, 378, 979, 976, 416, 61, 927, 254, 929, 256, + 51, 53, 54, 260, 261, 1233, 3, 991, 164, 266, + 267, 268, 269, 539, 271, 403, 273, 274, 275, 1005, + 603, 61, 62, 1059, 1322, 1159, 1062, 284, 25, 198, + 570, 1083, 289, 290, 201, 292, 872, 540, 164, 890, + 893, 298, 878, 569, 898, 302, 303, 598, 902, 552, + 307, 308, 906, 907, 908, 312, 313, 911, 912, 836, + 807, 915, 862, 320, 752, 67, 866, 324, 7, 1121, + 327, 24, 11, 12, 13, 14, 470, 334, 17, 336, + 337, 338, 339, 340, 513, 342, 39, 6, 7, 347, + 92, 356, 17, 12, 9, 48, 1105, 1231, 17, 1086, + 1087, 26, 17, 1086, 1140, 64, 409, 1143, 19, 412, + 1172, 1173, 377, 979, 35, 981, 202, 28, 17, 985, + 765, 766, 767, 209, 77, 17, 1057, 26, 53, 54, + 69, 30, 31, 1080, 41, 976, 17, 7, 979, 397, + 981, 11, 12, 13, 985, 26, 404, 17, 793, 1152, + 386, 21, 22, 389, 53, 54, 392, 1160, 50, 51, + 418, 9, 35, 82, 151, 86, 87, 357, 1302, 17, + 427, 428, 151, 17, 364, 371, 1163, 434, 435, 23, + 437, 150, 1113, 56, 441, 442, 443, 574, 445, 57, + 38, 774, 1046, 1047, 1048, 1049, 580, 586, 455, 69, + 457, 458, 583, 460, 633, 462, 463, 48, 465, 466, + 598, 468, 469, 86, 87, 17, 473, 474, 475, 1233, + 17, 478, 1169, 1089, 26, 22, 483, 484, 1005, 31, + 487, 488, 7, 759, 7, 851, 11, 494, 495, 12, + 497, 498, 17, 500, 501, 1086, 1087, 1088, 1089, 162, + 163, 53, 54, 510, 511, 512, 882, 147, 1294, 149, + 517, 31, 519, 1194, 521, 791, 523, 24, 1215, 1216, + 697, 1202, 1203, 547, 548, 1129, 619, 7, 16, 622, + 547, 548, 12, 53, 54, 543, 17, 17, 374, 563, + 564, 32, 33, 25, 610, 7, 563, 564, 384, 11, + 12, 13, 14, 1307, 7, 33, 408, 574, 11, 1313, + 546, 17, 414, 549, 20, 551, 22, 1154, 554, 555, + 47, 1158, 1163, 1164, 1165, 17, 562, 160, 161, 21, + 22, 589, 74, 75, 592, 7, 156, 573, 158, 11, + 12, 13, 600, 579, 32, 17, 582, 62, 7, 585, + 155, 156, 11, 12, 13, 612, 45, 69, 17, 157, + 596, 1292, 619, 790, 156, 622, 158, 624, 1299, 626, + 147, 157, 1149, 58, 59, 1152, 162, 163, 164, 1156, + 7, 61, 62, 1160, 11, 12, 13, 644, 1229, 147, + 17, 149, 649, 650, 651, 22, 653, 654, 655, 656, + 53, 54, 659, 152, 153, 154, 147, 148, 795, 150, + 69, 152, 153, 154, 155, 156, 156, 112, 675, 676, + 677, 678, 117, 680, 119, 682, 121, 684, 123, 686, + 125, 1221, 29, 1223, 158, 826, 847, 1005, 829, 697, + 1217, 8, 69, 54, 7, 369, 703, 533, 11, 12, + 13, 537, 1314, 1315, 17, 346, 1233, 20, 715, 22, + 717, 769, 695, 720, 894, 722, 893, 724, 891, 726, + 556, 728, 1017, 1018, 731, 148, 816, 734, 786, 152, + 153, 154, 739, 740, 120, 742, 122, 817, 124, 746, + 126, 148, 925, 926, 751, 152, 153, 154, 155, 156, + 157, 818, 159, 976, 762, 527, 69, 1095, 1306, 1307, + 1308, 1309, 598, 1311, 1238, 1313, 739, 740, 604, 1193, + 7, 8, 608, 571, 11, 12, 13, 14, 1066, 1067, + 17, 147, 148, 1197, 35, 1071, 152, 153, 154, 26, + 1309, 1156, 29, 30, 31, 1315, 804, 1312, 0, 807, + 808, 201, 148, 624, 150, 56, 152, 153, 154, 60, + 536, 843, 956, 957, 129, 129, 53, 54, 55, 70, + 129, 129, 999, 1000, 832, 997, 129, 1375, 768, 199, + 1378, 771, 69, 960, 1382, 86, 87, 1385, 129, 199, + 478, 1389, 129, 570, 851, 785, 853, 988, 788, 990, + 1225, 129, 89, 129, 129, 862, 1102, 398, 129, 866, + 1039, 868, 1039, 870, 871, 872, 195, 195, 875, 815, + 129, 878, 1420, 597, 881, 882, 148, 1425, 150, 597, + 152, 153, 154, 155, 156, 893, 894, 159, 129, 597, + 597, 898, 731, 900, 9, 902, 129, 129, 129, 906, + 907, 908, 17, 129, 911, 912, 1083, 914, 915, 0, + 917, 26, 337, 920, 29, 30, 31, 1422, 925, 926, + 927, 334, 929, 38, 931, 932, 0, 934, 43, 339, + 1401, 0, 944, 769, -1, -1, 943, 944, 53, 54, + 55, 1304, -1, -1, 1121, 1308, 1309, -1, 1311, 1312, + 786, 1314, 1315, 1094, 1317, -1, -1, 361, -1, 148, + -1, -1, 970, 152, 153, 154, 155, 156, 372, 373, + 159, -1, -1, -1, -1, -1, -1, 381, -1, -1, + 816, -1, 818, 991, 388, 821, -1, 391, 824, -1, + 394, 827, -1, -1, 830, 1172, 1173, 1004, 402, -1, + 836, -1, -1, 1010, 1011, 1012, 1013, -1, 844, -1, + 1017, 1018, 1375, -1, -1, 1159, 148, -1, 150, 1382, + 152, 153, 154, 155, 156, -1, 1167, -1, 1035, 1392, + -1, 1039, -1, 1396, -1, 1042, 1043, 1044, -1, 1046, + 1047, 1048, 1049, -1, 1051, -1, 1053, 8, -1, -1, + 1057, -1, 1059, 1060, -1, 1062, 17, -1, -1, 1066, + 1067, -1, -1, -1, -1, 26, -1, -1, 29, 30, + 31, 147, 148, 10, 150, 1083, 152, 153, 154, 155, + 156, 18, -1, -1, -1, -1, -1, 1231, -1, -1, + 27, -1, 53, 54, 55, -1, -1, 34, -1, -1, + 37, -1, 1109, -1, 1111, -1, 1113, 1114, -1, -1, + -1, 1118, 1119, 1121, -1, 52, 1123, 1124, 954, 1126, + -1, -1, 1129, -1, 1131, -1, 63, -1, 964, 66, + -1, 68, -1, 1140, -1, -1, 1143, -1, -1, 1146, + 1147, -1, 79, 979, 81, 981, 83, -1, 85, 985, + -1, -1, -1, -1, 91, -1, -1, -1, 1302, 995, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 1005, + 7, -1, -1, -1, 11, 12, 13, 14, -1, -1, + 17, -1, 1189, -1, 1191, -1, 1193, 1194, 1195, 26, + 1197, 1198, 29, 30, 31, 1202, 1203, -1, 1205, 36, + -1, -1, -1, -1, 1211, 1212, -1, -1, -1, 362, + 363, -1, -1, 366, 367, -1, 53, 54, 55, -1, + -1, -1, -1, -1, -1, -1, -1, 380, -1, -1, + 1237, 1238, 69, -1, 387, -1, 1377, 390, -1, -1, + 393, -1, -1, 1384, -1, -1, -1, -1, 401, -1, + -1, -1, 89, 1089, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1100, -1, -1, -1, -1, 1276, + 1277, 1278, 1279, 1280, -1, -1, 1283, 1284, 1285, 1286, + 1287, 9, -1, 1290, -1, 1292, -1, 1294, -1, 17, + -1, -1, 1299, -1, -1, -1, -1, -1, 26, -1, + -1, 29, 30, 31, -1, -1, -1, -1, -1, -1, + 38, -1, -1, 1149, 42, 43, 1152, -1, -1, -1, + 1156, -1, 1329, -1, 1160, 53, 54, 55, 45, 1336, + -1, 1338, -1, -1, -1, 52, 53, 1344, 55, 1346, + -1, 58, -1, 60, 1351, 62, -1, 1354, -1, 66, + -1, 68, 1359, 70, -1, 72, -1, 74, -1, 76, + -1, 78, -1, 80, 1372, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, 95, -1, + 97, 1217, 99, -1, 101, -1, 103, -1, 105, 1225, + -1, -1, -1, -1, 1401, -1, -1, 1233, -1, 1406, + 1407, -1, -1, 1410, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 147, -1, 109, 110, 111, 112, 113, -1, -1, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, -1, 130, 131, 132, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1304, -1, + 1306, 1307, 1308, 1309, 191, 1311, 1312, 1313, 1314, 1315, + -1, 1317, 203, -1, 205, -1, 207, 7, -1, 210, + -1, 11, 12, 13, 14, -1, -1, 17, -1, -1, + -1, -1, -1, -1, 10, -1, 26, -1, -1, 29, + 30, 31, 18, -1, -1, 192, -1, -1, -1, -1, + 197, 27, -1, -1, -1, -1, -1, -1, 34, -1, + -1, 248, -1, 53, 54, 55, 253, -1, 255, -1, + 46, 258, 259, -1, -1, -1, 52, -1, -1, 69, + -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, + 66, -1, 68, 280, 281, -1, -1, -1, 285, 89, + -1, 288, -1, 79, -1, 81, -1, 83, 295, 85, + -1, -1, 299, -1, -1, 91, -1, 304, -1, -1, + 9, -1, 309, -1, -1, -1, -1, 314, 17, -1, + -1, -1, 319, -1, 321, -1, -1, 26, 325, -1, + 29, 30, 31, -1, -1, 332, -1, -1, 335, 38, + -1, -1, -1, 344, -1, -1, 343, -1, -1, 17, + 351, -1, 353, 354, 53, 54, 55, -1, 26, -1, + 10, 29, 30, 31, -1, -1, -1, 17, 18, 370, + -1, -1, -1, -1, 375, 43, 26, 27, -1, 29, + 30, 31, -1, -1, 34, 53, 54, 55, -1, -1, + -1, -1, -1, 350, -1, -1, 46, -1, 355, 356, + -1, -1, 52, 53, 54, 55, -1, -1, -1, -1, + -1, -1, -1, 63, -1, -1, 66, -1, 68, 376, + 377, -1, -1, -1, -1, -1, -1, -1, 385, 79, + -1, 81, 429, 83, 431, 85, -1, -1, -1, 436, + 397, 91, -1, 400, -1, -1, -1, -1, -1, 446, + 407, -1, -1, 454, -1, -1, 453, -1, -1, -1, + -1, -1, -1, 464, 461, 17, -1, -1, -1, -1, + 471, -1, -1, -1, 26, -1, -1, 29, 30, 31, + -1, -1, 479, -1, 36, 486, -1, -1, 485, -1, -1, 492, 493, -1, -1, 496, -1, -1, 499, -1, - -1, -1, -1, -1, -1, 506, -1, -1, 509, -1, - -1, -1, -1, 514, -1, 516, -1, -1, -1, -1, - -1, 716, -1, 718, 525, -1, 721, -1, 723, -1, - 725, -1, 727, -1, -1, 730, -1, 538, -1, -1, - -1, 542, -1, 738, -1, -1, 741, -1, 743, -1, - -1, -1, -1, 748, -1, -1, 557, -1, -1, -1, + -1, 53, 54, 55, -1, 506, -1, 17, 509, -1, + -1, -1, -1, 514, -1, 516, 26, 17, -1, 29, + 30, 31, -1, 520, 525, -1, 26, 524, -1, 29, + 30, 31, -1, 43, -1, 45, -1, 538, -1, -1, + -1, 542, -1, 53, 54, 55, -1, -1, -1, -1, + -1, -1, -1, 53, 54, 55, 557, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 568, -1, -1, + -1, -1, 529, 530, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 599, -1, + -1, -1, -1, 550, -1, -1, -1, -1, 599, -1, -1, -1, -1, -1, 605, -1, -1, -1, 609, -1, - -1, -1, -1, -1, 615, -1, 617, 469, -1, -1, - 621, -1, -1, -1, -1, 477, 627, -1, -1, -1, - 482, -1, -1, 634, -1, -1, -1, 489, 490, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 507, 657, -1, -1, 660, + 567, -1, -1, -1, 615, -1, 617, -1, -1, -1, + 621, -1, -1, -1, -1, -1, 627, -1, -1, -1, + -1, -1, -1, 634, 631, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 606, + -1, -1, -1, 610, -1, -1, 657, -1, -1, 660, 661, 662, 663, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 674, -1, -1, -1, -1, -1, -1, - -1, -1, 683, -1, 685, -1, -1, 688, -1, 690, + -1, 668, -1, 674, -1, -1, 673, -1, 317, 318, + -1, 320, 683, -1, 685, -1, -1, 688, -1, 690, -1, 692, -1, -1, -1, -1, -1, 698, -1, -1, - 108, 109, 110, 111, 112, 113, 114, -1, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, -1, 928, 142, 143, 144, 145, 146, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 716, + -1, 718, -1, -1, 721, -1, 723, -1, 725, -1, + 727, -1, -1, 730, -1, -1, -1, -1, -1, -1, + -1, 738, -1, -1, 741, -1, 743, -1, -1, -1, + -1, 748, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 770, -1, 772, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 787, -1, 789, -1, -1, -1, -1, -1, -1, 796, -1, 798, -1, 800, - -1, 802, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 666, 667, -1, -1, -1, -1, - 672, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1028, -1, 687, 837, 689, -1, 691, - -1, 693, -1, -1, 845, -1, -1, -1, -1, -1, + -1, 802, -1, -1, 761, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1060, -1, -1, -1, -1, + -1, -1, -1, -1, 781, -1, 783, -1, -1, -1, + 469, -1, -1, -1, -1, -1, 837, -1, 477, -1, + -1, -1, -1, 482, 845, -1, -1, -1, -1, -1, + 489, 490, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 820, -1, -1, 823, -1, 507, -1, + -1, -1, -1, -1, -1, 832, -1, -1, -1, -1, + -1, 838, -1, -1, 841, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 905, -1, -1, -1, -1, 910, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1097, -1, 905, -1, -1, -1, 1103, 910, - 1105, -1, -1, 1108, -1, -1, -1, -1, -1, -1, -1, 922, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 933, -1, -1, -1, -1, -1, -1, 940, - 1135, -1, 943, 944, 945, 946, 947, 948, -1, -1, - 951, -1, 953, -1, -1, 956, -1, -1, -1, -1, - 961, -1, 963, 964, 965, -1, -1, -1, -1, -1, - -1, 972, -1, -1, -1, -1, -1, -1, 1173, -1, - 1175, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1191, -1, -1, -1, - -1, 1002, -1, -1, -1, -1, 858, 859, 860, 861, - -1, 863, 864, -1, -1, -1, -1, -1, -1, -1, - -1, 873, -1, 875, 876, -1, -1, -1, -1, -1, - -1, 883, 884, -1, -1, -1, 1037, -1, -1, -1, - -1, -1, -1, -1, 896, -1, -1, -1, -1, -1, - -1, 1052, -1, 1054, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1071, 1072, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1091, 1286, -1, -1, -1, 1096, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1317, -1, -1, -1, -1, -1, -1, 1324, - -1, -1, -1, -1, -1, -1, -1, 1332, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1158, -1, 1160, - 1012, -1, -1, -1, -1, 1017, 1018, -1, 1020, -1, - -1, -1, -1, -1, 1026, -1, -1, 1029, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1197, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1211, -1, -1, -1, -1, -1, -1, -1, 1219, -1, - 1221, 1222, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, -1, -1, -1, -1, 1267, -1, -1, -1, - -1, -1, -1, 1274, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1290, - -1, 1292, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1306, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1186, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1201, - -1, -1, 1353, 1354, -1, -1, -1, -1, -1, -1, + -1, 928, 933, -1, 935, -1, -1, -1, -1, -1, + -1, 942, -1, -1, 945, 946, 947, 948, 949, 950, + -1, -1, 953, -1, 955, -1, -1, 958, -1, -1, + -1, -1, 963, -1, 965, 966, 967, -1, -1, -1, + -1, -1, -1, 974, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1006, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 666, 667, -1, + -1, -1, -1, 672, 991, 1032, -1, -1, -1, -1, + 1041, -1, -1, -1, -1, 1002, -1, -1, 687, -1, + 689, -1, 691, -1, 693, 1056, -1, 1058, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1065, -1, + -1, -1, -1, -1, -1, 1076, 1077, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1096, -1, -1, -1, -1, + -1, -1, 1103, -1, -1, -1, -1, 1104, -1, -1, + -1, -1, -1, 1110, -1, 1112, -1, -1, 1115, -1, + -1, -1, -1, 1080, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1142, -1, 1148, 1105, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1171, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1186, + -1, 1188, -1, -1, 1151, -1, -1, 1154, -1, -1, + -1, 1158, -1, -1, -1, -1, -1, 1204, -1, 1210, + -1, -1, 1169, -1, -1, -1, -1, -1, -1, 858, + 859, 860, 861, 1224, 863, 864, -1, -1, -1, -1, + -1, 1232, -1, 1234, 873, -1, 875, 876, -1, -1, + -1, -1, -1, -1, 883, 884, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 896, 1215, 1216, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1228, -1, -1, -1, -1, -1, -1, -1, -1, + 1281, -1, -1, -1, -1, -1, -1, 1288, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1303, 1300, 1305, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1319, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1330, -1, -1, -1, -1, -1, -1, + 1337, -1, -1, -1, -1, -1, -1, -1, 1345, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1366, 1367, 4, 5, -1, + -1, -1, -1, 10, -1, -1, -1, 1016, 15, -1, + 17, 18, 1021, 1022, -1, 1024, -1, 24, -1, -1, + 27, 1030, -1, -1, 1033, -1, -1, 34, 35, -1, + 37, -1, 39, 1404, -1, -1, -1, 44, -1, 46, + 1411, -1, 49, -1, -1, 52, -1, -1, -1, -1, + -1, -1, -1, 60, -1, -1, 63, -1, 65, 66, + 67, 68, 1433, -1, -1, -1, -1, -1, -1, 76, + 77, -1, 79, 80, 81, -1, 83, 84, 85, 86, + 87, 88, -1, 90, 91, 92, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1199, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1213, 1214, 108, 109, 110, 111, + 112, 113, 114, -1, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, -1, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1391, -1, -1, -1, -1, -1, -1, 1398, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1296, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1420, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1282, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1323, -1, -1, 1326, 1327, -1, + 1329, -1, -1, -1, 1333, 1334, -1, 1336, -1, 1338, + -1, -1, 1341, 1342, -1, 1344, -1, 1346, -1, 1348, + 1349, -1, 1351, 1352, -1, 1354, 1355, -1, 1357, -1, + 1359, 1360, -1, 1362, -1, 1364, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1310, -1, - -1, 1313, 1314, -1, 1316, -1, -1, -1, 1320, 1321, - -1, 1323, -1, 1325, -1, -1, 1328, 1329, -1, 1331, - -1, 1333, -1, 1335, 1336, -1, 1338, 1339, -1, 1341, - 1342, -1, 1344, -1, 1346, 1347, -1, 1349, -1, 1351, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1403, -1, 1405, 1406, -1, 1408, + 1409, 1410, -1, 1412, 1413, 1414, 1415, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1390, -1, - 1392, 1393, -1, 1395, 1396, 1397, -1, 1399, 1400, 1401, - 1402, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1419, -1, 1421 + -1, -1, -1, 1432, -1, 1434 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -2003,221 +2021,222 @@ 0, 4, 5, 10, 15, 17, 18, 24, 27, 34, 35, 37, 39, 44, 46, 49, 52, 60, 63, 65, 66, 67, 68, 76, 77, 79, 80, 81, 83, 84, - 85, 86, 87, 88, 90, 91, 92, 165, 166, 167, - 238, 240, 306, 307, 310, 312, 333, 334, 335, 336, - 337, 338, 341, 342, 344, 346, 354, 355, 356, 362, - 363, 374, 376, 387, 388, 389, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 411, 432, 433, 434, 436, 438, 439, 445, 446, 451, - 456, 459, 462, 465, 466, 469, 474, 476, 479, 483, - 496, 500, 501, 506, 508, 509, 0, 159, 160, 202, - 202, 202, 202, 202, 163, 204, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 147, 205, 241, 205, 313, 205, - 340, 340, 205, 347, 6, 82, 350, 351, 205, 357, - 340, 205, 377, 340, 357, 340, 357, 340, 357, 340, - 357, 205, 447, 205, 470, 335, 336, 337, 338, 362, - 388, 389, 399, 403, 407, 432, 445, 451, 456, 459, - 462, 465, 475, 477, 478, 205, 484, 484, 484, 40, - 488, 489, 204, 204, 204, 204, 204, 202, 204, 204, - 204, 204, 204, 358, 204, 358, 204, 358, 204, 204, - 410, 204, 204, 161, 162, 203, 204, 204, 480, 481, - 204, 497, 498, 204, 502, 503, 204, 202, 148, 149, - 151, 152, 153, 154, 155, 168, 169, 170, 172, 174, - 175, 178, 180, 181, 205, 242, 61, 314, 316, 19, - 28, 56, 307, 312, 323, 324, 343, 355, 370, 371, - 435, 437, 440, 442, 443, 444, 323, 343, 435, 437, - 172, 348, 205, 352, 344, 364, 365, 367, 368, 369, - 370, 371, 3, 25, 378, 379, 70, 310, 312, 323, - 390, 397, 452, 453, 454, 455, 23, 238, 359, 360, - 203, 71, 401, 457, 458, 203, 72, 405, 460, 461, - 203, 73, 409, 463, 464, 50, 51, 238, 412, 413, - 415, 416, 203, 64, 448, 449, 466, 467, 508, 74, - 75, 471, 472, 78, 485, 486, 488, 485, 488, 485, - 488, 41, 490, 491, 167, 180, 150, 168, 179, 172, - 204, 239, 204, 308, 311, 202, 202, 204, 202, 204, - 202, 202, 204, 204, 204, 204, 204, 204, 204, 204, - 358, 204, 202, 202, 204, 375, 202, 202, 204, 204, - 204, 202, 204, 259, 204, 202, 204, 204, 202, 204, - 204, 202, 204, 204, 202, 259, 259, 202, 204, 259, - 202, 204, 202, 204, 202, 204, 481, 202, 204, 204, - 498, 204, 204, 503, 204, 204, 202, 203, 173, 176, - 177, 181, 180, 32, 33, 169, 205, 243, 244, 245, - 247, 248, 203, 62, 314, 319, 320, 344, 203, 203, - 205, 317, 313, 355, 57, 325, 326, 16, 268, 269, - 271, 273, 274, 276, 339, 350, 205, 372, 372, 48, - 418, 420, 418, 355, 339, 418, 418, 172, 349, 171, - 173, 353, 203, 374, 372, 372, 9, 238, 381, 383, - 203, 205, 380, 313, 397, 276, 391, 418, 372, 238, - 238, 205, 361, 268, 418, 372, 268, 418, 372, 268, - 418, 372, 180, 184, 186, 205, 414, 412, 205, 417, - 418, 372, 467, 180, 473, 205, 487, 490, 25, 422, - 423, 490, 47, 510, 514, 167, 180, 204, 204, 202, - 202, 308, 311, 204, 309, 202, 204, 204, 315, 204, - 204, 204, 328, 202, 202, 203, 204, 204, 204, 204, - 202, 204, 204, 203, 204, 204, 204, 345, 204, 259, - 172, 203, 204, 204, 204, 259, 375, 202, 259, 204, - 204, 202, 203, 204, 204, 259, 259, 203, 203, 204, - 204, 203, 204, 204, 203, 204, 204, 155, 157, 183, - 185, 189, 192, 203, 259, 203, 204, 204, 204, 468, - 168, 203, 203, 204, 204, 499, 202, 204, 204, 207, - 202, 203, 244, 247, 205, 246, 205, 249, 238, 322, - 169, 321, 319, 238, 318, 203, 314, 339, 58, 59, - 329, 331, 203, 180, 327, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 277, - 278, 279, 268, 323, 343, 323, 343, 268, 205, 421, - 268, 339, 268, 268, 7, 11, 238, 260, 264, 203, - 7, 12, 258, 263, 268, 323, 343, 323, 343, 205, - 384, 203, 314, 391, 277, 268, 323, 397, 268, 401, - 268, 405, 268, 409, 180, 187, 180, 193, 268, 440, - 442, 443, 444, 450, 26, 29, 30, 31, 53, 54, - 55, 208, 210, 211, 212, 213, 214, 215, 216, 219, - 220, 221, 223, 224, 229, 231, 234, 235, 238, 250, - 251, 467, 203, 180, 422, 38, 43, 208, 383, 425, - 429, 430, 494, 495, 203, 205, 424, 45, 507, 208, - 203, 484, 204, 203, 203, 309, 203, 309, 315, 204, - 203, 202, 168, 203, 204, 204, 204, 204, 204, 204, - 441, 204, 441, 203, 204, 203, 203, 203, 203, 259, - 259, 202, 259, 202, 203, 204, 204, 366, 204, 366, - 204, 204, 203, 204, 203, 204, 259, 203, 259, 203, - 259, 203, 259, 185, 183, 156, 158, 181, 182, 190, - 193, 198, 199, 200, 203, 204, 204, 202, 204, 209, - 202, 204, 209, 202, 204, 209, 202, 204, 209, 202, - 204, 209, 202, 209, 202, 468, 204, 482, 202, 499, - 499, 202, 207, 202, 204, 330, 202, 204, 511, 512, - 247, 314, 205, 332, 180, 151, 152, 153, 280, 280, - 280, 280, 355, 238, 350, 203, 355, 203, 422, 205, - 266, 266, 355, 238, 258, 350, 373, 203, 355, 203, - 171, 385, 314, 280, 397, 203, 203, 203, 203, 180, - 188, 193, 180, 194, 182, 201, 374, 212, 238, 250, - 215, 219, 238, 250, 205, 217, 223, 229, 234, 205, - 222, 229, 234, 169, 225, 234, 169, 232, 184, 205, - 236, 147, 206, 42, 208, 425, 429, 492, 493, 494, - 203, 384, 384, 321, 238, 203, 374, 418, 479, 500, - 504, 422, 485, 330, 259, 259, 259, 259, 441, 259, - 259, 441, 204, 419, 204, 204, 366, 259, 204, 259, - 259, 366, 204, 382, 259, 259, 185, 201, 182, 191, - 198, 194, 259, 209, 204, 209, 203, 204, 209, 204, - 209, 209, 203, 204, 209, 209, 204, 209, 204, 204, - 203, 482, 482, 204, 207, 202, 207, 204, 204, 203, - 203, 204, 513, 204, 512, 203, 203, 203, 203, 203, - 203, 203, 238, 425, 429, 203, 172, 267, 267, 203, - 373, 203, 7, 11, 12, 13, 238, 256, 257, 386, - 203, 203, 203, 180, 195, 196, 203, 218, 220, 223, - 229, 234, 229, 234, 234, 234, 169, 226, 169, 233, - 184, 205, 237, 494, 167, 385, 205, 431, 204, 208, - 383, 429, 515, 203, 204, 204, 204, 204, 259, 419, - 419, 259, 259, 259, 259, 202, 259, 204, 168, 198, - 203, 204, 204, 204, 204, 209, 209, 209, 209, 204, - 204, 230, 203, 207, 203, 204, 330, 507, 202, 513, - 513, 8, 282, 284, 281, 284, 282, 283, 284, 203, - 203, 266, 281, 180, 197, 198, 223, 229, 234, 229, - 234, 234, 234, 169, 227, 260, 203, 7, 11, 12, - 13, 14, 69, 426, 427, 428, 203, 202, 384, 204, - 272, 202, 204, 270, 202, 207, 204, 275, 202, 204, - 204, 392, 198, 204, 204, 204, 209, 204, 330, 202, - 504, 204, 7, 11, 12, 13, 14, 69, 89, 208, - 252, 253, 254, 255, 261, 265, 305, 205, 285, 208, - 281, 305, 285, 208, 283, 285, 267, 36, 208, 305, - 393, 394, 229, 234, 234, 234, 169, 228, 203, 266, - 203, 385, 202, 202, 204, 204, 270, 207, 204, 275, - 204, 259, 204, 207, 207, 202, 204, 203, 204, 262, - 204, 505, 259, 266, 266, 208, 108, 109, 110, 111, - 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 142, 143, 144, - 145, 146, 298, 107, 115, 140, 141, 286, 289, 298, - 107, 115, 140, 141, 291, 294, 298, 203, 393, 205, - 395, 234, 267, 203, 208, 494, 507, 203, 203, 204, - 262, 204, 296, 204, 204, 204, 204, 203, 204, 204, - 204, 204, 204, 203, 204, 207, 330, 259, 207, 202, - 267, 203, 22, 238, 261, 297, 303, 304, 203, 20, - 238, 253, 287, 299, 300, 303, 287, 21, 238, 253, - 288, 301, 302, 303, 288, 238, 253, 290, 303, 238, - 292, 299, 303, 287, 238, 293, 301, 303, 293, 238, - 295, 303, 203, 504, 259, 259, 259, 204, 259, 202, - 259, 259, 204, 259, 202, 204, 259, 259, 259, 204, - 259, 202, 204, 259, 259, 259, 204, 259, 259, 204, - 259, 259, 259, 204, 259, 259, 259, 259, 203, 203, - 261, 180, 253, 303, 169, 253, 253, 303, 169, 253, - 253, 303, 303, 505, 259, 203, 259, 204, 259, 204, - 259, 259, 204, 259, 203, 259, 259, 259, 259, 253, - 258, 253, 259, 203, 259 + 85, 86, 87, 88, 90, 91, 92, 166, 167, 168, + 239, 241, 307, 308, 311, 313, 334, 335, 336, 337, + 338, 339, 342, 343, 345, 347, 355, 356, 357, 363, + 364, 375, 377, 388, 389, 390, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 412, 434, 435, 436, 438, 440, 441, 447, 448, 453, + 458, 461, 464, 467, 468, 471, 476, 478, 481, 485, + 498, 502, 503, 508, 510, 511, 0, 160, 161, 203, + 203, 203, 203, 203, 164, 205, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 147, 206, 242, 206, 314, 206, + 341, 341, 206, 348, 6, 82, 351, 352, 206, 358, + 341, 206, 378, 341, 358, 341, 358, 341, 358, 341, + 358, 206, 449, 206, 472, 336, 337, 338, 339, 363, + 389, 390, 400, 404, 408, 434, 447, 453, 458, 461, + 464, 467, 477, 479, 480, 206, 486, 486, 486, 40, + 490, 491, 205, 205, 205, 205, 205, 203, 205, 205, + 205, 205, 205, 359, 205, 359, 205, 359, 205, 205, + 411, 205, 205, 162, 163, 204, 205, 205, 482, 483, + 205, 499, 500, 205, 504, 505, 205, 203, 148, 150, + 152, 153, 154, 155, 156, 169, 170, 171, 173, 175, + 176, 179, 181, 182, 206, 243, 61, 315, 317, 19, + 28, 56, 308, 313, 324, 325, 344, 356, 371, 372, + 437, 439, 442, 444, 445, 446, 324, 344, 437, 439, + 173, 349, 206, 353, 345, 365, 366, 368, 369, 370, + 371, 372, 3, 25, 379, 380, 70, 311, 313, 324, + 391, 398, 454, 455, 456, 457, 23, 239, 360, 361, + 204, 71, 402, 459, 460, 204, 72, 406, 462, 463, + 204, 73, 410, 465, 466, 50, 51, 239, 413, 414, + 416, 417, 204, 64, 450, 451, 468, 469, 510, 74, + 75, 473, 474, 78, 487, 488, 490, 487, 490, 487, + 490, 41, 492, 493, 168, 181, 151, 169, 180, 173, + 205, 240, 205, 309, 312, 203, 203, 205, 203, 205, + 203, 203, 205, 205, 205, 205, 205, 205, 205, 205, + 359, 205, 203, 203, 205, 376, 203, 203, 205, 205, + 205, 203, 205, 260, 205, 203, 205, 205, 203, 205, + 205, 203, 205, 205, 203, 260, 260, 203, 205, 260, + 203, 205, 203, 205, 203, 205, 483, 203, 205, 205, + 500, 205, 205, 505, 205, 205, 203, 204, 174, 177, + 178, 182, 181, 32, 33, 170, 206, 244, 245, 246, + 248, 249, 204, 62, 315, 320, 321, 345, 204, 204, + 206, 318, 314, 356, 57, 326, 327, 16, 269, 270, + 272, 274, 275, 277, 340, 351, 206, 373, 373, 48, + 419, 421, 419, 356, 340, 419, 419, 173, 350, 172, + 174, 354, 204, 375, 373, 373, 9, 239, 382, 384, + 204, 206, 381, 314, 398, 277, 392, 419, 373, 239, + 239, 206, 362, 269, 419, 373, 269, 419, 373, 269, + 419, 373, 181, 185, 187, 206, 415, 413, 206, 418, + 419, 373, 469, 181, 475, 206, 489, 492, 25, 423, + 424, 492, 47, 512, 516, 168, 181, 205, 205, 203, + 203, 309, 312, 205, 310, 203, 205, 205, 316, 205, + 205, 205, 329, 203, 203, 204, 205, 205, 205, 205, + 203, 205, 205, 204, 205, 205, 205, 346, 205, 260, + 173, 204, 205, 205, 205, 260, 376, 203, 260, 205, + 205, 203, 204, 205, 205, 260, 260, 204, 204, 205, + 205, 204, 205, 205, 204, 205, 205, 156, 158, 184, + 186, 190, 193, 204, 260, 204, 205, 205, 205, 470, + 169, 204, 204, 205, 205, 501, 203, 205, 205, 208, + 203, 204, 245, 248, 206, 247, 206, 250, 239, 323, + 170, 322, 320, 239, 319, 204, 315, 340, 58, 59, + 330, 332, 204, 181, 328, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 278, + 279, 280, 269, 324, 344, 324, 344, 269, 206, 422, + 269, 340, 269, 269, 7, 11, 239, 261, 265, 204, + 7, 12, 259, 264, 269, 324, 344, 324, 344, 206, + 385, 204, 315, 392, 278, 269, 324, 398, 269, 402, + 269, 406, 269, 410, 181, 188, 181, 194, 269, 442, + 444, 445, 446, 452, 26, 29, 30, 31, 53, 54, + 55, 209, 211, 212, 213, 214, 215, 216, 217, 220, + 221, 222, 224, 225, 230, 232, 235, 236, 239, 251, + 252, 469, 204, 181, 423, 38, 43, 209, 384, 426, + 431, 432, 496, 497, 204, 206, 425, 45, 509, 209, + 204, 486, 205, 204, 204, 310, 204, 310, 316, 205, + 204, 203, 169, 204, 205, 205, 205, 205, 205, 205, + 443, 205, 443, 204, 205, 204, 204, 204, 204, 260, + 260, 203, 260, 203, 204, 205, 205, 367, 205, 367, + 205, 205, 204, 205, 204, 205, 260, 204, 260, 204, + 260, 204, 260, 186, 184, 157, 159, 182, 183, 191, + 194, 199, 200, 201, 204, 205, 205, 203, 205, 210, + 203, 205, 210, 203, 205, 210, 203, 205, 210, 203, + 205, 210, 203, 210, 203, 470, 205, 484, 203, 501, + 501, 203, 208, 203, 205, 331, 203, 205, 513, 514, + 248, 315, 206, 333, 181, 152, 153, 154, 281, 281, + 281, 281, 356, 239, 351, 204, 356, 204, 423, 206, + 267, 267, 356, 239, 259, 351, 374, 204, 356, 204, + 172, 386, 315, 281, 398, 204, 204, 204, 204, 181, + 189, 194, 181, 195, 183, 202, 375, 213, 239, 251, + 216, 220, 239, 251, 206, 218, 224, 230, 235, 206, + 223, 230, 235, 170, 226, 235, 170, 233, 185, 206, + 237, 147, 207, 42, 209, 426, 431, 494, 495, 496, + 204, 149, 385, 427, 385, 322, 239, 204, 375, 419, + 481, 502, 506, 423, 487, 331, 260, 260, 260, 260, + 443, 260, 260, 443, 205, 420, 205, 205, 367, 260, + 205, 260, 260, 367, 205, 383, 260, 260, 186, 202, + 183, 192, 199, 195, 260, 210, 205, 210, 204, 205, + 210, 205, 210, 210, 204, 205, 210, 210, 205, 210, + 205, 205, 204, 484, 484, 205, 208, 203, 208, 205, + 205, 204, 205, 204, 204, 205, 515, 205, 514, 204, + 204, 204, 204, 204, 204, 204, 239, 426, 431, 204, + 173, 268, 268, 204, 374, 204, 7, 11, 12, 13, + 239, 257, 258, 387, 204, 204, 204, 181, 196, 197, + 204, 219, 221, 224, 230, 235, 230, 235, 235, 235, + 170, 227, 170, 234, 185, 206, 238, 496, 168, 386, + 386, 206, 433, 205, 209, 384, 431, 517, 204, 205, + 205, 205, 205, 260, 420, 420, 260, 260, 260, 260, + 203, 260, 205, 169, 199, 204, 205, 205, 205, 205, + 210, 210, 210, 210, 205, 205, 231, 204, 208, 204, + 205, 331, 205, 331, 509, 203, 515, 515, 8, 283, + 285, 282, 285, 283, 284, 285, 204, 204, 267, 282, + 181, 198, 199, 224, 230, 235, 230, 235, 235, 235, + 170, 228, 261, 204, 7, 11, 12, 13, 14, 69, + 428, 429, 430, 428, 204, 203, 149, 385, 518, 205, + 273, 203, 205, 271, 203, 208, 205, 276, 203, 205, + 205, 393, 199, 205, 205, 205, 210, 205, 331, 203, + 331, 506, 205, 205, 204, 7, 11, 12, 13, 14, + 69, 89, 209, 253, 254, 255, 256, 262, 266, 306, + 206, 286, 209, 282, 306, 286, 209, 284, 286, 268, + 36, 209, 306, 394, 395, 230, 235, 235, 235, 170, + 229, 267, 204, 386, 386, 203, 203, 205, 205, 271, + 208, 205, 276, 205, 260, 205, 208, 208, 203, 205, + 204, 205, 263, 205, 507, 260, 260, 267, 267, 209, + 108, 109, 110, 111, 112, 113, 114, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 142, 143, 144, 145, 146, 299, 107, 115, 140, + 141, 287, 290, 299, 107, 115, 140, 141, 292, 295, + 299, 204, 394, 206, 396, 235, 268, 204, 209, 496, + 509, 204, 205, 263, 205, 297, 205, 205, 205, 205, + 204, 205, 205, 205, 205, 205, 204, 205, 208, 331, + 260, 208, 203, 268, 204, 22, 239, 262, 298, 304, + 305, 204, 20, 239, 254, 288, 300, 301, 304, 288, + 21, 239, 254, 289, 302, 303, 304, 289, 239, 254, + 291, 304, 239, 293, 300, 304, 288, 239, 294, 302, + 304, 294, 239, 296, 304, 204, 506, 260, 260, 260, + 205, 260, 203, 260, 260, 205, 260, 203, 205, 260, + 260, 260, 205, 260, 203, 205, 260, 260, 260, 205, + 260, 260, 205, 260, 260, 260, 205, 260, 260, 260, + 260, 204, 204, 262, 181, 254, 304, 170, 254, 254, + 304, 170, 254, 254, 304, 304, 507, 260, 204, 260, + 205, 260, 205, 260, 260, 205, 260, 204, 260, 260, + 260, 260, 254, 259, 254, 260, 204, 260 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_int16 yyr1[] = { - 0, 164, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 166, 166, 166, 166, 166, 166, 167, 167, - 168, 169, 169, 170, 171, 172, 172, 173, 173, 174, - 175, 176, 177, 178, 178, 179, 179, 180, 180, 180, - 180, 181, 181, 182, 183, 184, 184, 184, 185, 185, - 186, 187, 188, 189, 190, 190, 191, 191, 192, 193, - 194, 195, 195, 195, 196, 197, 198, 198, 199, 200, - 200, 201, 201, 202, 202, 203, 203, 204, 205, 206, - 207, 207, 208, 208, 208, 209, 209, 209, 210, 210, - 211, 211, 211, 212, 212, 212, 212, 213, 214, 215, - 216, 217, 218, 218, 218, 218, 218, 218, 218, 218, - 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 230, 231, 232, 233, 234, 235, 236, - 236, 237, 237, 238, 239, 239, 239, 239, 239, 239, - 239, 240, 241, 242, 242, 243, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 252, 253, 254, 255, - 255, 255, 255, 255, 256, 257, 257, 257, 257, 258, - 259, 259, 260, 261, 262, 262, 263, 263, 264, 264, - 265, 265, 266, 267, 268, 268, 268, 268, 269, 270, - 270, 270, 270, 271, 272, 272, 272, 272, 273, 274, - 275, 275, 275, 276, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 278, 278, 279, 279, 280, 280, 280, - 281, 282, 283, 284, 285, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 287, 287, 287, 287, 287, 287, - 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, - 289, 289, 290, 290, 290, 290, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 292, 292, 292, 292, 293, - 293, 293, 293, 294, 294, 295, 295, 296, 296, 297, - 297, 297, 297, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 306, 307, 308, - 308, 309, 309, 310, 311, 311, 312, 313, 314, 315, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 327, 327, 328, 328, 329, 330, 330, - 331, 331, 332, 333, 333, 333, 334, 334, 335, 336, - 337, 338, 339, 339, 340, 341, 341, 342, 342, 343, - 343, 344, 345, 345, 345, 346, 346, 347, 348, 349, - 350, 351, 351, 352, 353, 353, 354, 354, 355, 356, - 356, 356, 357, 358, 358, 358, 358, 359, 360, 361, - 362, 363, 363, 364, 364, 364, 364, 365, 366, 366, - 366, 366, 366, 367, 368, 369, 370, 371, 372, 373, - 374, 375, 375, 375, 376, 377, 378, 379, 379, 380, - 381, 382, 382, 382, 383, 384, 385, 386, 387, 387, - 388, 389, 390, 390, 391, 392, 392, 392, 392, 392, - 393, 394, 395, 396, 396, 397, 398, 398, 398, 399, - 400, 400, 401, 402, 402, 403, 404, 405, 406, 406, - 407, 408, 409, 410, 410, 410, 410, 410, 411, 411, - 412, 413, 414, 414, 415, 416, 417, 418, 419, 419, - 419, 419, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 428, 428, 428, 428, 428, 429, 430, 431, 432, - 432, 432, 433, 433, 434, 435, 435, 436, 437, 437, - 438, 439, 440, 441, 441, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 450, 450, 450, 451, 452, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 466, 466, 466, 466, 466, - 466, 466, 466, 466, 466, 466, 467, 467, 468, 468, - 468, 469, 470, 471, 472, 472, 473, 473, 473, 474, - 475, 475, 476, 477, 477, 477, 477, 477, 477, 477, - 477, 477, 477, 477, 477, 477, 477, 478, 478, 478, - 478, 478, 478, 478, 479, 480, 480, 481, 482, 482, - 482, 482, 482, 482, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 497, 498, 499, 499, 499, 499, 499, 500, 501, 502, - 502, 503, 504, 504, 504, 504, 505, 505, 505, 505, - 506, 507, 508, 509, 510, 511, 511, 512, 513, 513, - 513, 513, 514, 515 + 0, 165, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 167, 167, 167, 167, 167, 167, 168, 168, + 169, 170, 170, 171, 172, 173, 173, 174, 174, 175, + 176, 177, 178, 179, 179, 180, 180, 181, 181, 181, + 181, 182, 182, 183, 184, 185, 185, 185, 186, 186, + 187, 188, 189, 190, 191, 191, 192, 192, 193, 194, + 195, 196, 196, 196, 197, 198, 199, 199, 200, 201, + 201, 202, 202, 203, 203, 204, 204, 205, 206, 207, + 208, 208, 209, 209, 209, 210, 210, 210, 211, 211, + 212, 212, 212, 213, 213, 213, 213, 214, 215, 216, + 217, 218, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 231, 232, 233, 234, 235, 236, 237, + 237, 238, 238, 239, 240, 240, 240, 240, 240, 240, + 240, 241, 242, 243, 243, 244, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 253, 254, 255, 256, + 256, 256, 256, 256, 257, 258, 258, 258, 258, 259, + 260, 260, 261, 262, 263, 263, 264, 264, 265, 265, + 266, 266, 267, 268, 269, 269, 269, 269, 270, 271, + 271, 271, 271, 272, 273, 273, 273, 273, 274, 275, + 276, 276, 276, 277, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 279, 279, 280, 280, 281, 281, 281, + 282, 283, 284, 285, 286, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, + 288, 288, 289, 289, 289, 289, 289, 289, 289, 289, + 290, 290, 291, 291, 291, 291, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 293, 293, 293, 293, 294, + 294, 294, 294, 295, 295, 296, 296, 297, 297, 298, + 298, 298, 298, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 307, 308, 309, + 309, 310, 310, 311, 312, 312, 313, 314, 315, 316, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 328, 328, 329, 329, 330, 331, 331, + 332, 332, 333, 334, 334, 334, 335, 335, 336, 337, + 338, 339, 340, 340, 341, 342, 342, 343, 343, 344, + 344, 345, 346, 346, 346, 347, 347, 348, 349, 350, + 351, 352, 352, 353, 354, 354, 355, 355, 356, 357, + 357, 357, 358, 359, 359, 359, 359, 360, 361, 362, + 363, 364, 364, 365, 365, 365, 365, 366, 367, 367, + 367, 367, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 376, 376, 377, 378, 379, 380, 380, 381, + 382, 383, 383, 383, 384, 385, 386, 387, 388, 388, + 389, 390, 391, 391, 392, 393, 393, 393, 393, 393, + 394, 395, 396, 397, 397, 398, 399, 399, 399, 400, + 401, 401, 402, 403, 403, 404, 405, 406, 407, 407, + 408, 409, 410, 411, 411, 411, 411, 411, 412, 412, + 413, 414, 415, 415, 416, 417, 418, 419, 420, 420, + 420, 420, 421, 422, 423, 424, 425, 426, 427, 427, + 427, 428, 429, 430, 430, 430, 430, 430, 430, 431, + 432, 433, 434, 434, 434, 435, 435, 436, 437, 437, + 438, 439, 439, 440, 441, 442, 443, 443, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 452, 452, + 452, 453, 454, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 468, 468, + 468, 468, 468, 468, 468, 468, 468, 468, 468, 469, + 469, 470, 470, 470, 471, 472, 473, 474, 474, 475, + 475, 475, 476, 477, 477, 478, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 480, 480, 480, 480, 480, 480, 480, 481, 482, 482, + 483, 484, 484, 484, 484, 484, 484, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 499, 500, 501, 501, 501, 501, 501, + 502, 503, 504, 504, 505, 506, 506, 506, 506, 507, + 507, 507, 507, 508, 509, 510, 511, 512, 513, 513, + 514, 515, 515, 515, 515, 516, 517, 518, 518 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -2275,24 +2294,24 @@ 1, 1, 5, 1, 1, 8, 1, 5, 1, 1, 8, 1, 5, 0, 3, 5, 3, 3, 1, 1, 4, 1, 1, 1, 4, 1, 1, 7, 0, 3, - 3, 3, 1, 1, 5, 1, 1, 9, 1, 5, - 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, - 1, 1, 1, 1, 10, 1, 1, 10, 1, 1, - 10, 10, 7, 0, 3, 3, 9, 7, 9, 10, - 1, 1, 9, 1, 1, 1, 1, 1, 10, 1, - 1, 7, 9, 1, 10, 7, 1, 10, 7, 1, - 10, 7, 1, 9, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, - 2, 1, 1, 4, 1, 1, 1, 2, 3, 4, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 1, 1, 5, 1, 1, 4, 6, 4, + 6, 1, 5, 1, 1, 1, 1, 1, 1, 7, + 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, + 10, 1, 1, 10, 10, 7, 0, 3, 3, 9, + 7, 9, 10, 1, 1, 9, 1, 1, 1, 1, + 1, 10, 1, 1, 7, 9, 1, 10, 7, 1, + 10, 7, 1, 10, 7, 1, 9, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 3, 2, 1, 1, 4, 1, 1, 1, + 2, 3, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 3, 1, 8, 0, 3, - 3, 3, 5, 3, 2, 1, 1, 4, 1, 1, - 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, - 1, 6, 0, 3, 3, 3, 2, 1, 4, 3, - 1, 16, 1, 1, 1, 1, 0, 6, 3, 2, - 1, 1, 9, 1, 4, 3, 1, 4, 0, 3, - 3, 2, 1, 7 + 1, 1, 1, 1, 1, 1, 1, 4, 3, 1, + 8, 0, 3, 3, 3, 5, 3, 2, 1, 1, + 4, 1, 1, 4, 1, 4, 1, 4, 1, 4, + 1, 4, 3, 1, 6, 0, 3, 3, 3, 2, + 1, 4, 3, 1, 16, 1, 1, 1, 1, 0, + 6, 3, 2, 1, 1, 9, 1, 4, 3, 1, + 4, 0, 3, 3, 2, 1, 4, 4, 4 }; diff -Nru proj-9.0.0/src/wkt2_generated_parser.h proj-9.0.1/src/wkt2_generated_parser.h --- proj-9.0.0/src/wkt2_generated_parser.h 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/wkt2_generated_parser.h 2022-04-29 18:18:53.000000000 +0000 @@ -34,8 +34,8 @@ /* Undocumented macros, especially those whose name start with YY_, are private implementation details. Do not rely on them. */ -#ifndef YY_PJ_WKT2_SRC_WKT2_GENERATED_PARSER_H_INCLUDED -# define YY_PJ_WKT2_SRC_WKT2_GENERATED_PARSER_H_INCLUDED +#ifndef YY_PJ_WKT2_WKT2_GENERATED_PARSER_H_INCLUDED +# define YY_PJ_WKT2_WKT2_GENERATED_PARSER_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -195,7 +195,8 @@ T_PAST = 400, T_UNSPECIFIED = 401, T_STRING = 402, - T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE = 403 + T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE = 403, + T_EPSG_CODE_FOR_INTERPOLATION = 404 }; #endif @@ -210,4 +211,4 @@ int pj_wkt2_parse (pj_wkt2_parse_context *context); -#endif /* !YY_PJ_WKT2_SRC_WKT2_GENERATED_PARSER_H_INCLUDED */ +#endif /* !YY_PJ_WKT2_WKT2_GENERATED_PARSER_H_INCLUDED */ diff -Nru proj-9.0.0/src/wkt2_grammar.y proj-9.0.1/src/wkt2_grammar.y --- proj-9.0.0/src/wkt2_grammar.y 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/wkt2_grammar.y 2022-04-29 18:18:53.000000000 +0000 @@ -196,6 +196,8 @@ %token T_STRING "string" %token T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE "unsigned integer" +%token T_EPSG_CODE_FOR_INTERPOLATION "EPSG code for interpolation CRS" + %token END 0 "end of string" %% @@ -1229,10 +1231,16 @@ operation_method_name: quoted_latin_text // Derived CRS conversion parameter -operation_parameter: parameter_keyword left_delimiter parameter_name - wkt_separator parameter_value wkt_separator parameter_unit - opt_separator_identifier - right_delimiter +operation_parameter: parameter_keyword left_delimiter operation_parameter_body right_delimiter + +// The way the WKT output of epsg.org (e.g https://epsg.org/transformation/wkt/id/9617) +// conveys interpolation CRS is with a PARAMETER without unit +// (e.g PARAMETER["EPSG code for Interpolation CRS",7886,ID["EPSG",1048]]), +// whereas it is normally required. As an exception, accept this lack of unit. +operation_parameter_body: + parameter_name wkt_separator parameter_value wkt_separator parameter_unit opt_separator_identifier + | T_EPSG_CODE_FOR_INTERPOLATION wkt_separator parameter_value opt_separator_identifier + | T_EPSG_CODE_FOR_INTERPOLATION wkt_separator parameter_value wkt_separator parameter_unit opt_separator_identifier parameter_unit: length_or_angle_or_scale_or_time_or_parametric_unit @@ -1617,6 +1625,9 @@ abridged_transformation_keyword: T_ABRIDGEDTRANSFORMATION abridged_transformation_parameter: parameter_keyword left_delimiter - parameter_name wkt_separator parameter_value - opt_separator_identifier_list + abridged_transformation_parameter_body right_delimiter + +abridged_transformation_parameter_body: + parameter_name wkt_separator parameter_value opt_separator_identifier_list + | T_EPSG_CODE_FOR_INTERPOLATION wkt_separator parameter_value opt_separator_identifier_list diff -Nru proj-9.0.0/src/wkt2_parser.cpp proj-9.0.1/src/wkt2_parser.cpp --- proj-9.0.0/src/wkt2_parser.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/src/wkt2_parser.cpp 2022-04-29 18:18:53.000000000 +0000 @@ -38,6 +38,7 @@ #include "wkt2_parser.h" #include "wkt_parser.hpp" +#include "proj_constants.h" using namespace NS_PROJ::internal; @@ -181,6 +182,15 @@ /* -------------------------------------------------------------------- */ if (*pszInput == '"') { pszInput++; + + if( strncmp(pszInput, EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS, + strlen(EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS)) == 0 && + pszInput[strlen(EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS)] == '"' ) + { + context->pszNext = pszInput + strlen(EPSG_NAME_PARAMETER_EPSG_CODE_FOR_INTERPOLATION_CRS) + 1; + return T_EPSG_CODE_FOR_INTERPOLATION; + } + while (*pszInput != '\0') { if (*pszInput == '"') { if (pszInput[1] == '"') diff -Nru proj-9.0.0/test/cli/testprojinfo proj-9.0.1/test/cli/testprojinfo --- proj-9.0.0/test/cli/testprojinfo 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/cli/testprojinfo 2022-06-08 15:59:53.000000000 +0000 @@ -319,12 +319,12 @@ $EXE -s EPSG:23030 -t EPSG:25830 --bbox -6,40,-5,41 --grid-check known_available --hide-ballpark --summary >>${OUT} 2>&1 echo "" >>${OUT} -echo 'Testing --list-crs | grep "EPSG:32632\|ESRI:103668\|OGC" | sort' >> ${OUT} -$EXE --list-crs | grep "EPSG:32632\|ESRI:103668\|OGC" | sort >> ${OUT} +echo 'Testing --list-crs | grep "EPSG:32632\|ESRI:103668\|OGC"' >> ${OUT} +$EXE --list-crs | grep "EPSG:32632\|ESRI:103668\|OGC" >> ${OUT} echo "" >>${OUT} -echo 'Testing --list-crs --authority OGC,EPSG | grep "EPSG:4326\|OGC" | sort' >> ${OUT} -$EXE --list-crs --authority OGC,EPSG | grep "EPSG:4326\|OGC" | sort >> ${OUT} +echo 'Testing --list-crs --authority OGC,EPSG | grep "EPSG:4326\|OGC"' >> ${OUT} +$EXE --list-crs --authority OGC,EPSG | grep "EPSG:4326\|OGC" >> ${OUT} echo "" >>${OUT} echo 'Testing --list-crs | grep deprecated | sort' >> ${OUT} @@ -376,6 +376,13 @@ $EXE --list-crs projected --area France | grep "RGF93 v1 / Lambert-93\|UTM zone 11N" | sort >> ${OUT} echo "" >>${OUT} +# Test North-Macedonia CRS for which there are several MGI 1901 -> WGS 84 Helmert transformations +# but only one matches the extent of the CRS +echo 'Testing EPSG:9945 -o PROJ -q' >> ${OUT} +$EXE EPSG:9945 -o PROJ -q >> ${OUT} +echo "" >>${OUT} + + # do 'diff' with distribution results echo "diff ${OUT} with testprojinfo_out.dist" diff -u ${OUT} ${TEST_CLI_DIR}/testprojinfo_out.dist diff -Nru proj-9.0.0/test/cli/testprojinfo_out.dist proj-9.0.1/test/cli/testprojinfo_out.dist --- proj-9.0.0/test/cli/testprojinfo_out.dist 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/cli/testprojinfo_out.dist 2022-06-08 15:59:53.000000000 +0000 @@ -1624,18 +1624,20 @@ unknown id, Inverse of UTM zone 30N + ED50 to ETRS89 (12) + UTM zone 30N, 0.2 m, Spain - mainland, Balearic Islands, Ceuta and Melila - onshore. unknown id, Inverse of UTM zone 30N + ED50 to ETRS89 (7) + UTM zone 30N, 1.5 m, Spain - onshore mainland except northwest (north of 41°30'N and west of 4°30'W). -Testing --list-crs | grep "EPSG:32632\|ESRI:103668\|OGC" | sort +Testing --list-crs | grep "EPSG:32632\|ESRI:103668\|OGC" EPSG:32632 "WGS 84 / UTM zone 32N" ESRI:103668 "NAD_1983_HARN_Adj_MN_Ramsey_Meters" OGC:CRS27 "NAD27 (CRS27)" OGC:CRS83 "NAD83 (CRS83)" OGC:CRS84 "WGS 84 (CRS84)" +OGC:CRS84h "WGS 84 longitude-latitude-height" -Testing --list-crs --authority OGC,EPSG | grep "EPSG:4326\|OGC" | sort -EPSG:4326 "WGS 84" +Testing --list-crs --authority OGC,EPSG | grep "EPSG:4326\|OGC" OGC:CRS27 "NAD27 (CRS27)" OGC:CRS83 "NAD83 (CRS83)" OGC:CRS84 "WGS 84 (CRS84)" +OGC:CRS84h "WGS 84 longitude-latitude-height" +EPSG:4326 "WGS 84" Testing --list-crs | grep deprecated | sort @@ -1681,3 +1683,6 @@ Testing --list-crs projected --area France | grep "RGF93 v1 / Lambert-93\|UTM zone 11N" | sort EPSG:2154 "RGF93 v1 / Lambert-93" +Testing EPSG:9945 -o PROJ -q ++proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=500000 +y_0=-4000000 +ellps=bessel +towgs84=521.748,229.489,590.921,4.029,4.488,-15.521,-9.78 +units=m +no_defs +type=crs + diff -Nru proj-9.0.0/test/gie/builtins.gie proj-9.0.1/test/gie/builtins.gie --- proj-9.0.0/test/gie/builtins.gie 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/gie/builtins.gie 2022-06-08 15:59:53.000000000 +0000 @@ -3599,6 +3599,18 @@ accept -2 -1 expect -201113.698641813 -124066.283433860 roundtrip 1 +accept 0.0 89.99 +expect 0.00 9050917.562466157600 +roundtrip 1 +accept 0.0 89.999 +expect 0.00 9050964.513822982088 +roundtrip 1 +accept 0.0 -89.99 +expect 0.0 -9050917.562466157600 +roundtrip 1 +accept 0.0 -89.999 +expect 0.00 -9050964.513822982088 +roundtrip 1 direction inverse accept 200 100 diff -Nru proj-9.0.0/test/gie/more_builtins.gie proj-9.0.1/test/gie/more_builtins.gie --- proj-9.0.0/test/gie/more_builtins.gie 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/gie/more_builtins.gie 2022-06-08 15:59:53.000000000 +0000 @@ -878,5 +878,147 @@ expect 5.875 55.375 0 ------------------------------------------------------------------------------- +=============================================================================== +# Tests for testing that +omit_fwd, +omit_inv and +inv work together like they +# should. +# +# +omit_fwd specifies that a step should be omitted when running forwards. +# +# +omit_inv specifies that a step should be omitted when running backwards. +# +# +inv specifies that a step should be inverted. The forward path would do +# inverse operation and inverse path would do forward operation. +# +# | | invertible step | non-invertible step | +# | flags | forward path | inverse path | forward path | inverse path | +# | -------------- | ------------ | ------------ | ------------ | ------------ | +# | +omit_fwd | omit | inv | omit | undefined | +# | +omit_fwd +inv | omit | fwd | omit | fwd | +# | +omit_inv | fwd | omit | fwd | omit | +# | +omit_inv +inv | inv | omit | undefined | omit | +# +# From the table we can see that invertible steps should work pretty much all +# the time. Non-invertible steps on the other hand make either the forward path +# or inverse path undefined depending on which flags the step has. +# +# A non-invertible step is for example an affine transformation where we cannot +# calculate the inverse of the matrix. +=============================================================================== + +------------------------------------------------------------------------------- +# Test that +omit_fwd, +omit_inv and +inv work correctly with an invertible step. +------------------------------------------------------------------------------- + +# Test that forward path does nothing and inverse path does inverse transformation + +operation proj=pipeline step proj=affine s11=2 omit_fwd + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect 0.5 2 3 + +# Test that forward path does nothing and inverse path does forward transformation + +operation proj=pipeline step proj=affine s11=2 omit_fwd inv + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect 2 2 3 + +# Test that forward path does forward transformation and inverse path does nothing + +operation proj=pipeline step proj=affine s11=2 omit_inv + +direction forward +accept 1 2 3 +expect 2 2 3 + +direction inverse +accept 1 2 3 +expect 1 2 3 + +# Test that forward path does inverse transformation and inverse path does nothing + +operation proj=pipeline step proj=affine s11=2 omit_inv inv + +direction forward +accept 1 2 3 +expect 0.5 2 3 + +direction inverse +accept 1 2 3 +expect 1 2 3 + +------------------------------------------------------------------------------- +# Test that +omit_fwd, +omit_inv and +inv work correctly with a non-invertible step. +------------------------------------------------------------------------------- + +# Test that forward path does nothing and inverse path is not defined. +# +# The affine transformation is not invertible so this pipeline cannot be executed in +# reverse. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_fwd + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect failure errno no_inverse_op + +# Test that forward path does nothing and inverse path does forward transformation. +# +# The affine transformation does not have an inverse, but inv specifies that the +# step should be done in inverse order relative to our pipeline direction. When +# we execute the pipeline in reverse, we should call the forward transformation of +# the step which is defined so the pipeline should be valid in reverse. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_fwd inv + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect 6 0 0 + +# Test that the forward path does forward transformation and inverse path does nothing. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_inv + +direction forward +accept 1 2 3 +expect 6 0 0 + +direction inverse +accept 1 2 3 +expect 1 2 3 + +# Test that the forward path is not defined and inverse path does nothing. +# +# When going through the forward path, inv specifies that we should execute the +# step in reverse. Because the affine transformation does not have an inverse, +# this means that the forward path does not exist. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_inv inv + +direction forward +accept 1 2 3 +expect failure errno no_inverse_op + +direction inverse +accept 1 2 3 +expect 1 2 3 diff -Nru proj-9.0.0/test/gie/nkg.gie proj-9.0.1/test/gie/nkg.gie --- proj-9.0.0/test/gie/nkg.gie 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/gie/nkg.gie 2022-03-25 07:13:55.000000000 +0000 @@ -208,15 +208,15 @@ # STAS accept 3275753.4135 321111.2481 5445042.2134 2020.0 -expect 3275753.9111 321110.8658 5445041.8822 2020.0 +expect 3275753.9094 321110.8626 5445041.8818 2020.0 # BOD3 accept 2391773.9918 615615.1837 5860966.1279 2020.0 -expect 2391774.5535 615614.9100 5860965.8138 2020.0 +expect 2391774.5481 615614.9063 5860965.8185 2020.0 # KAUS accept 2107888.9134 895603.4769 5933242.6269 2020.0 -expect 2107889.5097 895603.2085 5933242.3152 2020.0 +expect 2107889.5014 895603.2055 5933242.3208 2020.0 # ------------------------------------------------------------------------------- diff -Nru proj-9.0.0/test/unit/gie_self_tests.cpp proj-9.0.1/test/unit/gie_self_tests.cpp --- proj-9.0.0/test/unit/gie_self_tests.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/unit/gie_self_tests.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -618,7 +618,6 @@ // --------------------------------------------------------------------------- TEST(gie, unitconvert_selftest) { - char args1[] = "+proj=unitconvert +t_in=decimalyear +t_out=decimalyear"; double in1 = 2004.25; @@ -641,6 +640,36 @@ test_time(args5, 1e-6, in5, in5); } +static void test_date(const char *args, double tol, double t_in, double t_exp) { + PJ_COORD in, out; + PJ *P = proj_create(PJ_DEFAULT_CTX, args); + + ASSERT_TRUE(P != 0); + + in = proj_coord(0.0, 0.0, 0.0, t_in); + + out = proj_trans(P, PJ_FWD, in); + EXPECT_NEAR(out.xyzt.t, t_exp, tol); + + proj_destroy(P); + + proj_log_level(NULL, PJ_LOG_NONE); +} + +TEST(gie, unitconvert_selftest_date) { + char args[] = "+proj=unitconvert +t_in=decimalyear +t_out=yyyymmdd"; + test_date(args, 1e-6, 2022.0027, 20220102); + test_date(args, 1e-6, 1990.0, 19900101); + test_date(args, 1e-6, 2004.1612, 20040229); + test_date(args, 1e-6, 1899.999, 19000101); + + strcpy(&args[18], "+t_in=yyyymmdd +t_out=decimalyear"); + test_date(args, 1e-6, 20220102, 2022.0027397); + test_date(args, 1e-6, 19900101, 1990.0); + test_date(args, 1e-6, 20040229, 2004.1612022); + test_date(args, 1e-6, 18991231, 1899.9972603); +} + static const char tc32_utm32[] = { " +proj=horner" " +ellps=intl" diff -Nru proj-9.0.0/test/unit/test_datum.cpp proj-9.0.1/test/unit/test_datum.cpp --- proj-9.0.0/test/unit/test_datum.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/unit/test_datum.cpp 2022-03-25 07:13:55.000000000 +0000 @@ -287,6 +287,33 @@ drf->exportToWKT( WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get()), expected_wtk2_2019); + + EXPECT_TRUE(drf->isEquivalentTo(drf.get())); + EXPECT_TRUE( + drf->isEquivalentTo(drf.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_FALSE(drf->isEquivalentTo(createUnrelatedObject().get())); + + // "Same" datum, except that it is a non-dynamic one + auto datum = GeodeticReferenceFrame::create( + PropertyMap().set(IdentifiedObject::NAME_KEY, "test"), Ellipsoid::WGS84, + optional("My anchor"), PrimeMeridian::GREENWICH); + EXPECT_FALSE(datum->isEquivalentTo(drf.get())); + EXPECT_FALSE(drf->isEquivalentTo(datum.get())); + EXPECT_TRUE( + datum->isEquivalentTo(drf.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_TRUE( + drf->isEquivalentTo(datum.get(), IComparable::Criterion::EQUIVALENT)); + + auto unrelated_datum = GeodeticReferenceFrame::create( + PropertyMap().set(IdentifiedObject::NAME_KEY, "test2"), + Ellipsoid::WGS84, optional("My anchor"), + PrimeMeridian::GREENWICH); + EXPECT_FALSE(unrelated_datum->isEquivalentTo(drf.get())); + EXPECT_FALSE(drf->isEquivalentTo(unrelated_datum.get())); + EXPECT_FALSE(unrelated_datum->isEquivalentTo( + drf.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_FALSE(drf->isEquivalentTo(unrelated_datum.get(), + IComparable::Criterion::EQUIVALENT)); } // --------------------------------------------------------------------------- @@ -395,6 +422,32 @@ drf->exportToWKT( WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get()), expected_wtk2_2019); + + EXPECT_TRUE(drf->isEquivalentTo(drf.get())); + EXPECT_TRUE( + drf->isEquivalentTo(drf.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_FALSE(drf->isEquivalentTo(createUnrelatedObject().get())); + + // "Same" datum, except that it is a non-dynamic one + auto datum = VerticalReferenceFrame::create( + PropertyMap().set(IdentifiedObject::NAME_KEY, "test"), + optional("My anchor"), optional()); + EXPECT_FALSE(datum->isEquivalentTo(drf.get())); + EXPECT_FALSE(drf->isEquivalentTo(datum.get())); + EXPECT_TRUE( + datum->isEquivalentTo(drf.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_TRUE( + drf->isEquivalentTo(datum.get(), IComparable::Criterion::EQUIVALENT)); + + auto unrelated_datum = VerticalReferenceFrame::create( + PropertyMap().set(IdentifiedObject::NAME_KEY, "test2"), + optional("My anchor"), optional()); + EXPECT_FALSE(unrelated_datum->isEquivalentTo(drf.get())); + EXPECT_FALSE(drf->isEquivalentTo(unrelated_datum.get())); + EXPECT_FALSE(unrelated_datum->isEquivalentTo( + drf.get(), IComparable::Criterion::EQUIVALENT)); + EXPECT_FALSE(drf->isEquivalentTo(unrelated_datum.get(), + IComparable::Criterion::EQUIVALENT)); } // --------------------------------------------------------------------------- diff -Nru proj-9.0.0/test/unit/test_io.cpp proj-9.0.1/test/unit/test_io.cpp --- proj-9.0.0/test/unit/test_io.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/unit/test_io.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -3204,6 +3204,102 @@ // --------------------------------------------------------------------------- +TEST(wkt_parse, COORDINATEOPERATION_with_interpolation_as_parameter) { + auto wkt = + "COORDINATEOPERATION[\"SHGD2015 to SHGD2015 + SHVD2015 height (1)\",\n" + " VERSION[\"ENRD-Shn Hel\"],\n" + " SOURCECRS[\n" + " GEOGCRS[\"SHGD2015\",\n" + " DATUM[\"St. Helena Geodetic Datum 2015\",\n" + " ELLIPSOID[\"GRS 1980\",6378137,298.257222101,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,3],\n" + " AXIS[\"latitude\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"longitude\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"ellipsoidal height\",up,\n" + " ORDER[3],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",7885]]],\n" + " TARGETCRS[\n" + " COMPOUNDCRS[\"SHMG2015 + SHVD2015 height\",\n" + " PROJCRS[\"SHMG2015\",\n" + " BASEGEOGCRS[\"SHGD2015\",\n" + " DATUM[\"St. Helena Geodetic Datum 2015\",\n" + " ELLIPSOID[\"GRS " + "1980\",6378137,298.257222101,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",7886]],\n" + " CONVERSION[\"UTM zone 30S\",\n" + " METHOD[\"Transverse Mercator\",\n" + " ID[\"EPSG\",9807]],\n" + " PARAMETER[\"Latitude of natural origin\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8801]],\n" + " PARAMETER[\"Longitude of natural origin\",-3,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8802]],\n" + " PARAMETER[\"Scale factor at natural " + "origin\",0.9996,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8805]],\n" + " PARAMETER[\"False easting\",500000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8806]],\n" + " PARAMETER[\"False northing\",10000000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8807]]],\n" + " CS[Cartesian,2],\n" + " AXIS[\"(E)\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " AXIS[\"(N)\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " VERTCRS[\"SHVD2015 height\",\n" + " VDATUM[\"St. Helena Vertical Datum 2015\"],\n" + " CS[vertical,1],\n" + " AXIS[\"gravity-related height (H)\",up,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " ID[\"EPSG\",7956]]],\n" + " METHOD[\"Geog3D to Geog2D+GravityRelatedHeight (EGM2008)\",\n" + " ID[\"EPSG\",1092]],\n" + " PARAMETERFILE[\"Geoid (height correction) model file\"," + "\"Und_min2.5x2.5_egm2008_isw=82_WGS84_TideFree.gz\"],\n" + " PARAMETER[\"EPSG code for Interpolation CRS\",7886,\n" + " ID[\"EPSG\",1048]],\n" + " OPERATIONACCURACY[0],\n" + " ID[\"EPSG\",9617]]"; + + { + auto obj = WKTParser().createFromWKT(wkt); + auto transf = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(transf != nullptr); + EXPECT_TRUE(transf->interpolationCRS() == nullptr); + EXPECT_EQ(transf->parameterValues().size(), 2U); + } + + { + auto dbContext = DatabaseContext::create(); + // Need a database so that the interpolation CRS EPSG:7886 is resolved + auto obj = + WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto transf = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(transf != nullptr); + EXPECT_TRUE(transf->interpolationCRS() != nullptr); + EXPECT_EQ(transf->parameterValues().size(), 1U); + } +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, COORDINATEOPERATION_wkt2_2019) { std::string src_wkt; @@ -3827,6 +3923,201 @@ // --------------------------------------------------------------------------- +TEST(wkt_parse, CONCATENATEDOPERATION_with_inverse_conversion_of_compound) { + + auto wkt = + "CONCATENATEDOPERATION[\"Inverse of RD New + Amersfoort to ETRS89 (9) " + "+ Inverse of ETRS89 to NAP height (2) + ETRS89 to WGS 84 (1)\",\n" + " SOURCECRS[\n" + " COMPOUNDCRS[\"Amersfoort / RD New + NAP height\",\n" + " PROJCRS[\"Amersfoort / RD New\",\n" + " BASEGEOGCRS[\"Amersfoort\",\n" + " DATUM[\"Amersfoort\",\n" + " ELLIPSOID[\"Bessel " + "1841\",6377397.155,299.1528128,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",4289]],\n" + " CONVERSION[\"RD New\",\n" + " METHOD[\"Oblique Stereographic\",\n" + " ID[\"EPSG\",9809]],\n" + " PARAMETER[\"Latitude of natural " + "origin\",52.1561605555556,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8801]],\n" + " PARAMETER[\"Longitude of natural " + "origin\",5.38763888888889,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8802]],\n" + " PARAMETER[\"Scale factor at natural " + "origin\",0.9999079,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8805]],\n" + " PARAMETER[\"False easting\",155000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8806]],\n" + " PARAMETER[\"False northing\",463000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8807]]],\n" + " CS[Cartesian,2],\n" + " AXIS[\"easting (X)\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " AXIS[\"northing (Y)\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " VERTCRS[\"NAP height\",\n" + " VDATUM[\"Normaal Amsterdams Peil\"],\n" + " CS[vertical,1],\n" + " AXIS[\"gravity-related height (H)\",up,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " ID[\"EPSG\",7415]]],\n" + " TARGETCRS[\n" + " GEOGCRS[\"WGS 84 (3D)\",\n" + " ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n" + " MEMBER[\"World Geodetic System 1984 (Transit)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G730)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G873)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G1150)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G1674)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G1762)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G2139)\"],\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ENSEMBLEACCURACY[2.0]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,3],\n" + " AXIS[\"geodetic latitude (Lat)\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree minute second " + "hemisphere\",0.0174532925199433]],\n" + " AXIS[\"geodetic longitude (Long)\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree minute second " + "hemisphere\",0.0174532925199433]],\n" + " AXIS[\"ellipsoidal height (h)\",up,\n" + " ORDER[3],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",4329]]],\n" + " STEP[\n" + " CONVERSION[\"Inverse of RD New\",\n" + " METHOD[\"Inverse of Oblique Stereographic\",\n" + " ID[\"INVERSE(EPSG)\",9809]],\n" + " PARAMETER[\"Latitude of natural " + "origin\",52.1561605555556,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8801]],\n" + " PARAMETER[\"Longitude of natural " + "origin\",5.38763888888889,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8802]],\n" + " PARAMETER[\"Scale factor at natural origin\",0.9999079,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8805]],\n" + " PARAMETER[\"False easting\",155000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8806]],\n" + " PARAMETER[\"False northing\",463000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8807]],\n" + " ID[\"INVERSE(EPSG)\",19914]]],\n" + " STEP[\n" + " COORDINATEOPERATION[\"PROJ-based coordinate operation\",\n" + " SOURCECRS[\n" + " COMPOUNDCRS[\"Amersfoort + NAP height\",\n" + " GEOGCRS[\"Amersfoort\",\n" + " DATUM[\"Amersfoort\",\n" + " ELLIPSOID[\"Bessel " + "1841\",6377397.155,299.1528128,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " " + "ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,2],\n" + " AXIS[\"geodetic latitude (Lat)\",north,\n" + " ORDER[1],\n" + " " + "ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"geodetic longitude (Lon)\",east,\n" + " ORDER[2],\n" + " " + "ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",4289]],\n" + " VERTCRS[\"NAP height\",\n" + " VDATUM[\"Normaal Amsterdams Peil\"],\n" + " CS[vertical,1],\n" + " AXIS[\"gravity-related height (H)\",up,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",5709]]]],\n" + " TARGETCRS[\n" + " GEOGCRS[\"WGS 84 (3D)\",\n" + " ENSEMBLE[\"World Geodetic System 1984 " + "ensemble\",\n" + " MEMBER[\"World Geodetic System 1984 " + "(Transit)\"],\n" + " MEMBER[\"World Geodetic System 1984 " + "(G730)\"],\n" + " MEMBER[\"World Geodetic System 1984 " + "(G873)\"],\n" + " MEMBER[\"World Geodetic System 1984 " + "(G1150)\"],\n" + " MEMBER[\"World Geodetic System 1984 " + "(G1674)\"],\n" + " MEMBER[\"World Geodetic System 1984 " + "(G1762)\"],\n" + " MEMBER[\"World Geodetic System 1984 " + "(G2139)\"],\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ENSEMBLEACCURACY[2.0]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,3],\n" + " AXIS[\"geodetic latitude (Lat)\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree minute second " + "hemisphere\",0.0174532925199433]],\n" + " AXIS[\"geodetic longitude (Long)\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree minute second " + "hemisphere\",0.0174532925199433]],\n" + " AXIS[\"ellipsoidal height (h)\",up,\n" + " ORDER[3],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",4329]]],\n" + " METHOD[\"PROJ-based operation method: +proj=pipeline " + "+step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg " + "+xy_out=rad +step +proj=hgridshift +grids=nl_nsgi_rdtrans2018.tif " + "+step +proj=vgridshift +grids=nl_nsgi_nlgeo2018.tif +multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap " + "+order=2,1\"],\n" + " OPERATIONACCURACY[1.002]]],\n" + " USAGE[\n" + " SCOPE[\"unknown\"],\n" + " AREA[\"Netherlands - onshore, including Waddenzee, Dutch " + "Wadden Islands and 12-mile offshore coastal zone.\"],\n" + " BBOX[50.75,3.2,53.7,7.22]]]"; + + auto obj = WKTParser().createFromWKT(wkt); + auto concat = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(concat != nullptr); + + EXPECT_EQ(concat->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +inv +proj=sterea +lat_0=52.1561605555556 " + "+lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 " + "+ellps=bessel " + "+step +proj=hgridshift +grids=nl_nsgi_rdtrans2018.tif " + "+step +proj=vgridshift +grids=nl_nsgi_nlgeo2018.tif " + "+multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"); +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, BOUNDCRS_transformation_from_names) { auto projcrs = ProjectedCRS::create( @@ -3925,6 +4216,73 @@ // --------------------------------------------------------------------------- +TEST(wkt_parse, BOUNDCRS_with_interpolation_as_parameter) { + auto wkt = + "BOUNDCRS[\n" + " SOURCECRS[\n" + " VERTCRS[\"unknown\",\n" + " VDATUM[\"unknown using geoidgrids=@foo.gtx\"],\n" + " CS[vertical,1],\n" + " AXIS[\"gravity-related height (H)\",up,\n" + " LENGTHUNIT[\"metre\",1,\n" + " ID[\"EPSG\",9001]]]]],\n" + " TARGETCRS[\n" + " GEOGCRS[\"WGS 84\",\n" + " DATUM[\"World Geodetic System 1984\",\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,3],\n" + " AXIS[\"latitude\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"longitude\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"ellipsoidal height\",up,\n" + " ORDER[3],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",4979]]],\n" + " ABRIDGEDTRANSFORMATION[\"unknown to WGS84 ellipsoidal height\",\n" + " METHOD[\"GravityRelatedHeight to Geographic3D\"],\n" + " PARAMETERFILE[\"Geoid (height correction) model " + "file\",\"@foo.gtx\",\n" + " ID[\"EPSG\",8666]],\n" + " PARAMETER[\"EPSG code for Interpolation CRS\",7886]]]"; + + { + auto obj = WKTParser().createFromWKT(wkt); + auto boundCRS = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(boundCRS != nullptr); + EXPECT_TRUE(boundCRS->transformation()->interpolationCRS() == nullptr); + EXPECT_EQ(boundCRS->transformation()->parameterValues().size(), 2U); + } + + { + auto dbContext = DatabaseContext::create(); + // Need a database so that the interpolation CRS EPSG:7886 is resolved + auto obj = + WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto boundCRS = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(boundCRS != nullptr); + EXPECT_TRUE(boundCRS->transformation()->interpolationCRS() != nullptr); + EXPECT_EQ(boundCRS->transformation()->parameterValues().size(), 1U); + + // Check that on export, the interpolation CRS is exported as a + // parameter + auto exportedWKT = boundCRS->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get()); + EXPECT_TRUE( + exportedWKT.find( + "PARAMETER[\"EPSG code for Interpolation CRS\",7886,") != + std::string::npos) + << exportedWKT; + } +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, boundcrs_of_verticalcrs_to_geog3Dcrs) { auto wkt = "BOUNDCRS[\n" @@ -5465,6 +5823,23 @@ {"False northing", 2}, }}, + // Non standard parameter names longitude_of_center/latitude_of_center + // used in https://github.com/OSGeo/PROJ/issues/3210 + {"Stereographic", + {{"False_Easting", 1}, + {"False_Northing", 2}, + {"longitude_of_center", 3}, + {"Scale_Factor", 4}, + {"latitude_of_center", 5}}, + "Stereographic", + { + {"Latitude of natural origin", 5}, + {"Longitude of natural origin", 3}, + {"Scale factor at natural origin", 4}, + {"False easting", 1}, + {"False northing", 2}, + }}, + {"Stereographic", {{"False_Easting", 1}, {"False_Northing", 2}, @@ -6577,6 +6952,36 @@ // --------------------------------------------------------------------------- +TEST(wkt_parse, wkt1_pseudo_wkt1_gdal_pseudo_wkt1_esri) { + // WKT from https://github.com/OSGeo/PROJ/issues/3186 + auto wkt = "PROJCS[\"Equidistant_Cylindrical\"," + "GEOGCS[\"WGS 84\",DATUM[\"wgs_1984\"," + "SPHEROID[\"WGS 84\",6378137,298.257223563," + "AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]]," + "PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]]," + "UNIT[\"degree\",0.0174532925199433," + "AUTHORITY[\"EPSG\",\"9102\"]]," + "AUTHORITY[\"EPSG\",\"4326\"]]," + "PROJECTION[\"Equidistant_Cylindrical\"]," + "PARAMETER[\"false_easting\",0]," + "PARAMETER[\"false_northing\",0]," + "PARAMETER[\"central_meridian\",0]," + "PARAMETER[\"standard_parallel_1\",37]," + "UNIT[\"Meter\",1,AUTHORITY[\"EPSG\",\"9001\"]]," + "AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]"; + + auto dbContext = DatabaseContext::create(); + auto obj = WKTParser().attachDatabaseContext(dbContext).createFromWKT(wkt); + auto crs = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crs != nullptr); + + EXPECT_EQ(crs->derivingConversion()->method()->nameStr(), + "Equidistant Cylindrical"); + EXPECT_EQ(crs->derivingConversion()->method()->getEPSGCode(), 1028); +} + +// --------------------------------------------------------------------------- + TEST(wkt_parse, invalid) { EXPECT_THROW(WKTParser().createFromWKT(""), ParsingException); EXPECT_THROW(WKTParser().createFromWKT("A"), ParsingException); @@ -9657,7 +10062,9 @@ EXPECT_TRUE(wkt.find("METHOD[\"Popular Visualisation Pseudo " "Mercator\",ID[\"EPSG\",1024]") != std::string::npos) << wkt; - EXPECT_TRUE(wkt.find("DATUM[\"unknown\",") != std::string::npos) << wkt; + EXPECT_TRUE(wkt.find("DATUM[\"unknown using nadgrids=@null\",") != + std::string::npos) + << wkt; EXPECT_EQ( replaceAll(crs->exportToPROJString(PROJStringFormatter::create().get()), @@ -13236,6 +13643,13 @@ " },\n" " {\n" " \"name\": \"World Geodetic System 1984 (G730)\"\n" + " },\n" + " {\n" + " \"name\": \"Some unknown ensemble with unknown id\",\n" + " \"id\": {\n" + " \"authority\": \"UNKNOWN\",\n" + " \"code\": 1234\n" + " }\n" " }\n" " ],\n" " \"ellipsoid\": {\n" @@ -13285,6 +13699,13 @@ " \"authority\": \"EPSG\",\n" " \"code\": 1152\n" " }\n" + " },\n" + " {\n" + " \"name\": \"Some unknown ensemble with unknown id\",\n" + " \"id\": {\n" + " \"authority\": \"UNKNOWN\",\n" + " \"code\": 1234\n" + " }\n" " }\n" " ],\n" " \"ellipsoid\": {\n" diff -Nru proj-9.0.0/test/unit/test_metadata.cpp proj-9.0.1/test/unit/test_metadata.cpp --- proj-9.0.0/test/unit/test_metadata.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/unit/test_metadata.cpp 2022-06-07 18:31:42.000000000 +0000 @@ -383,16 +383,29 @@ // --------------------------------------------------------------------------- TEST(metadata, Identifier_isEquivalentName) { + EXPECT_TRUE(Identifier::isEquivalentName("", "")); + EXPECT_TRUE(Identifier::isEquivalentName("x", "x")); + EXPECT_TRUE(Identifier::isEquivalentName("x", "X")); + EXPECT_TRUE(Identifier::isEquivalentName("X", "x")); + EXPECT_FALSE(Identifier::isEquivalentName("x", "")); + EXPECT_FALSE(Identifier::isEquivalentName("", "x")); + EXPECT_FALSE(Identifier::isEquivalentName("x", "y")); EXPECT_TRUE(Identifier::isEquivalentName("Central_Meridian", "Central_- ()/Meridian")); EXPECT_TRUE(Identifier::isEquivalentName("\xc3\xa1", "a")); + EXPECT_FALSE(Identifier::isEquivalentName("\xc3", "a")); EXPECT_TRUE(Identifier::isEquivalentName("a", "\xc3\xa1")); + EXPECT_FALSE(Identifier::isEquivalentName("a", "\xc3")); EXPECT_TRUE(Identifier::isEquivalentName("\xc3\xa4", "\xc3\xa1")); EXPECT_TRUE(Identifier::isEquivalentName( "Unknown based on International 1924 (Hayford 1909, 1910) ellipsoid", "Unknown_based_on_International_1924_Hayford_1909_1910_ellipsoid")); + + EXPECT_TRUE(Identifier::isEquivalentName("foo + ", "foo + ")); + EXPECT_TRUE(Identifier::isEquivalentName("foo + bar", "foo + bar")); + EXPECT_TRUE(Identifier::isEquivalentName("foo + bar", "foobar")); } diff -Nru proj-9.0.0/test/unit/test_operationfactory.cpp proj-9.0.1/test/unit/test_operationfactory.cpp --- proj-9.0.0/test/unit/test_operationfactory.cpp 2022-02-23 18:51:04.000000000 +0000 +++ proj-9.0.1/test/unit/test_operationfactory.cpp 2022-06-08 15:59:53.000000000 +0000 @@ -3002,6 +3002,69 @@ // --------------------------------------------------------------------------- +TEST(operation, towgs84_pm_3d) { + // Test fix for https://github.com/OSGeo/gdal/issues/5408 + + auto dbContext = DatabaseContext::create(); + auto authFactory = AuthorityFactory::create(dbContext, std::string()); + + auto objSrc = PROJStringParser().createFromPROJString( + "+proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=-5000000 " + "+ellps=bessel +pm=ferro " + "+towgs84=1,2,3,4,5,6,7 " + "+units=m +no_defs +type=crs"); + auto src = nn_dynamic_pointer_cast(objSrc); + ASSERT_TRUE(src != nullptr); + auto src3D = src->promoteTo3D(std::string(), dbContext); + + auto objDst = PROJStringParser().createFromPROJString( + "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs +type=crs"); + auto dst = nn_dynamic_pointer_cast(objDst); + ASSERT_TRUE(dst != nullptr); + auto dst3D = dst->promoteTo3D(std::string(), dbContext); + + // Import thing to check is that there's no push/pop v_3 + const std::string expected_pipeline = + "+proj=pipeline " + "+step +inv +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=-5000000 " + "+ellps=bessel +pm=ferro " + "+step +proj=cart +ellps=bessel " + "+step +proj=helmert +x=1 +y=2 +z=3 +rx=4 " + "+ry=5 +rz=6 +s=7 +convention=position_vector " + "+step +inv +proj=cart +ellps=GRS80 " + "+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"; + + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + { + auto list = CoordinateOperationFactory::create()->createOperations( + src3D, dst3D, ctxt); + ASSERT_EQ(list.size(), 1U); + EXPECT_EQ( + list[0]->exportToPROJString(PROJStringFormatter::create().get()), + expected_pipeline); + } + + // Retry when creating objects from WKT + { + auto objSrcFromWkt = WKTParser().createFromWKT(src3D->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get())); + auto srcFromWkt = nn_dynamic_pointer_cast(objSrcFromWkt); + ASSERT_TRUE(srcFromWkt != nullptr); + auto objDstFromWkt = WKTParser().createFromWKT(dst3D->exportToWKT( + WKTFormatter::create(WKTFormatter::Convention::WKT2_2019).get())); + auto dstFromWkt = nn_dynamic_pointer_cast(objDstFromWkt); + ASSERT_TRUE(dstFromWkt != nullptr); + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(srcFromWkt), NN_NO_CHECK(dstFromWkt), ctxt); + ASSERT_EQ(list.size(), 1U); + EXPECT_EQ( + list[0]->exportToPROJString(PROJStringFormatter::create().get()), + expected_pipeline); + } +} + +// --------------------------------------------------------------------------- + TEST(operation, WGS84_G1762_to_compoundCRS_with_bound_vertCRS) { auto authFactoryEPSG = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); @@ -3812,6 +3875,74 @@ // --------------------------------------------------------------------------- TEST(operation, + compoundCRS_with_bound_of_projected_and_bound_of_vertical_to_geog3D) { + + auto dbContext = DatabaseContext::create(); + + const char *wktSrc = + "COMPD_CS[\"TempTM + CGVD28 height - HT2_0\",\n" + " PROJCS[\"Custom\",\n" + " GEOGCS[\"NAD83(CSRS)\",\n" + " DATUM[\"NAD83_Canadian_Spatial_Reference_System\",\n" + " SPHEROID[\"GRS 1980\",6378137,298.257222101,\n" + " AUTHORITY[\"EPSG\",\"7019\"]],\n" + " TOWGS84[0,0,0,0,0,0,0],\n" + " AUTHORITY[\"EPSG\",\"6140\"]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " AUTHORITY[\"EPSG\",\"8901\"]],\n" + " UNIT[\"degree\",0.0174532925199433,\n" + " AUTHORITY[\"EPSG\",\"9122\"]],\n" + " AUTHORITY[\"EPSG\",\"4617\"]],\n" + " PROJECTION[\"Transverse_Mercator\"],\n" + " PARAMETER[\"latitude_of_origin\",49.351346659616],\n" + " PARAMETER[\"central_meridian\",-123.20266499149],\n" + " PARAMETER[\"scale_factor\",1],\n" + " PARAMETER[\"false_easting\",15307.188],\n" + " PARAMETER[\"false_northing\",6540.975],\n" + " UNIT[\"Meters\",1],\n" + " AXIS[\"Easting\",EAST],\n" + " AXIS[\"Northing\",NORTH]],\n" + " VERT_CS[\"CGVD28 height - HT2_0\",\n" + " VERT_DATUM[\"Canadian Geodetic Vertical Datum of " + "1928\",2005,\n" + " EXTENSION[\"PROJ4_GRIDS\",\"HT2_0.gtx\"],\n" + " AUTHORITY[\"EPSG\",\"5114\"]],\n" + " UNIT[\"metre\",1,\n" + " AUTHORITY[\"EPSG\",\"9001\"]],\n" + " AXIS[\"Gravity-related height\",UP],\n" + " AUTHORITY[\"EPSG\",\"5713\"]]]"; + auto objSrc = + WKTParser().attachDatabaseContext(dbContext).createFromWKT(wktSrc); + auto srcCRS = nn_dynamic_pointer_cast(objSrc); + ASSERT_TRUE(srcCRS != nullptr); + + auto authFactoryEPSG = AuthorityFactory::create(dbContext, "EPSG"); + // NAD83(CSRS) 3D + auto dstCRS = authFactoryEPSG->createCoordinateReferenceSystem("4955"); + + auto ctxt = + CoordinateOperationContext::create(authFactoryEPSG, nullptr, 0.0); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + ctxt->setSpatialCriterion( + CoordinateOperationContext::SpatialCriterion::PARTIAL_INTERSECTION); + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(srcCRS), dstCRS, ctxt); + ASSERT_EQ(list.size(), 1U); + EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +inv +proj=tmerc +lat_0=49.351346659616 " + "+lon_0=-123.20266499149 +k=1 " + "+x_0=15307.188 +y_0=6540.975 +ellps=GRS80 " + "+step +proj=vgridshift +grids=HT2_0.gtx +multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"); +} + +// --------------------------------------------------------------------------- + +TEST(operation, compoundCRS_with_boundGeogCRS_and_geoid_to_geodCRS_NAD2011_ctxt) { auto dbContext = DatabaseContext::create(); @@ -4167,6 +4298,53 @@ TEST( operation, + compoundCRS_to_compoundCRS_with_bound_crs_in_horiz_and_vert_same_ellsp_but_different_towgs84_different_geoidgrids) { + auto objSrc = PROJStringParser().createFromPROJString( + "+proj=longlat +ellps=GRS80 +towgs84=1,2,3 +geoidgrids=@foo.gtx " + "+type=crs"); + auto src = nn_dynamic_pointer_cast(objSrc); + ASSERT_TRUE(src != nullptr); + auto objDst = PROJStringParser().createFromPROJString( + "+proj=longlat +ellps=GRS80 +towgs84=4,5,6 +geoidgrids=@bar.gtx " + "+type=crs"); + auto dst = nn_dynamic_pointer_cast(objDst); + ASSERT_TRUE(dst != nullptr); + + auto srcGeog = src->extractGeographicCRS(); + ASSERT_TRUE(srcGeog != nullptr); + ASSERT_TRUE(srcGeog->datum() != nullptr); + auto dstGeog = dst->extractGeographicCRS(); + ASSERT_TRUE(dstGeog != nullptr); + ASSERT_TRUE(dstGeog->datum() != nullptr); + EXPECT_FALSE(srcGeog->datum()->isEquivalentTo( + dstGeog->datum().get(), IComparable::Criterion::EQUIVALENT)); + + auto op = CoordinateOperationFactory::create()->createOperation( + NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dst)); + ASSERT_TRUE(op != nullptr); + // Check there's no proj=push +v_1 +v_2 + EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=push +v_3 " + "+step +proj=cart +ellps=GRS80 " + "+step +proj=helmert +x=1 +y=2 +z=3 " + "+step +inv +proj=cart +ellps=WGS84 " + "+step +proj=pop +v_3 " + "+step +proj=vgridshift +grids=@foo.gtx +multiplier=1 " + "+step +inv +proj=vgridshift +grids=@bar.gtx +multiplier=1 " + "+step +proj=push +v_3 " + "+step +proj=cart +ellps=WGS84 " + "+step +proj=helmert +x=-4 +y=-5 +z=-6 " + "+step +inv +proj=cart +ellps=GRS80 " + "+step +proj=pop +v_3 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); +} + +// --------------------------------------------------------------------------- + +TEST( + operation, compoundCRS_to_compoundCRS_with_bound_crs_in_horiz_and_vert_WKT1_same_geoidgrids_context) { auto objSrc = WKTParser().createFromWKT( "COMPD_CS[\"NAD83 / Alabama West + NAVD88 height - Geoid12B " @@ -4527,6 +4705,75 @@ // --------------------------------------------------------------------------- +TEST(operation, + compoundCRS_to_compoundCRS_OSGB36_BNG_ODN_height_to_WGS84_EGM96) { + auto dbContext = DatabaseContext::create(); + auto authFactory = AuthorityFactory::create(dbContext, std::string()); + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + // "OSGB36 / British National Grid + ODN height + auto srcObj = createFromUserInput("EPSG:27700+5701", dbContext, false); + auto src = nn_dynamic_pointer_cast(srcObj); + ASSERT_TRUE(src != nullptr); + auto authFactoryEPSG = + AuthorityFactory::create(dbContext, std::string("EPSG")); + auto dst = authFactoryEPSG->createCoordinateReferenceSystem( + "9707"); // "WGS 84 + EGM96 height" + + { + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(src), dst, ctxt); + ASSERT_GE(list.size(), 1U); + EXPECT_EQ(list[0]->nameStr(), "Inverse of British National Grid + " + "OSGB36 to ETRS89 (2) + " + "Inverse of ETRS89 to ODN height (2) + " + "ETRS89 to WGS 84 (1) + " + "WGS 84 to EGM96 height (1)"); + const char *expected_proj = + "+proj=pipeline " + "+step +inv +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 " + "+x_0=400000 +y_0=-100000 +ellps=airy " + "+step +proj=hgridshift +grids=uk_os_OSTN15_NTv2_OSGBtoETRS.tif " + "+step +proj=vgridshift +grids=uk_os_OSGM15_GB.tif +multiplier=1 " + "+step +inv +proj=vgridshift +grids=us_nga_egm96_15.tif " + "+multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"; + EXPECT_EQ( + list[0]->exportToPROJString(PROJStringFormatter::create().get()), + expected_proj); + } + + { + auto list = CoordinateOperationFactory::create()->createOperations( + dst, NN_NO_CHECK(src), ctxt); + ASSERT_GE(list.size(), 1U); + EXPECT_EQ(list[0]->nameStr(), "Inverse of WGS 84 to EGM96 height (1) + " + "Inverse of ETRS89 to WGS 84 (1) + " + "ETRS89 to ODN height (2) + " + "Inverse of OSGB36 to ETRS89 (2) + " + "British National Grid"); + const char *expected_proj = + "+proj=pipeline " + "+step +proj=axisswap +order=2,1 " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1 " + "+step +inv +proj=vgridshift +grids=uk_os_OSGM15_GB.tif " + "+multiplier=1 " + "+step +inv +proj=hgridshift " + "+grids=uk_os_OSTN15_NTv2_OSGBtoETRS.tif " + "+step +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 " + "+x_0=400000 +y_0=-100000 +ellps=airy"; + EXPECT_EQ( + list[0]->exportToPROJString(PROJStringFormatter::create().get()), + expected_proj); + } +} + +// --------------------------------------------------------------------------- + TEST( operation, compoundCRS_to_compoundCRS_concatenated_operation_with_two_vert_transformation) { @@ -4565,6 +4812,51 @@ // --------------------------------------------------------------------------- +TEST( + operation, + compoundCRS_to_compoundCRS_concatenated_operation_with_two_vert_transformation_and_different_source_dest_interp) { + auto authFactory = + AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + // "BD72 + Ostend height" + auto srcObj = createFromUserInput("EPSG:4313+5710", + authFactory->databaseContext(), false); + auto src = nn_dynamic_pointer_cast(srcObj); + ASSERT_TRUE(src != nullptr); + + // "Amersfoort + NAP height" + auto dstObj = createFromUserInput("EPSG:4289+5709", + authFactory->databaseContext(), false); + auto dst = nn_dynamic_pointer_cast(dstObj); + ASSERT_TRUE(dst != nullptr); + + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + ctxt->setSpatialCriterion( + CoordinateOperationContext::SpatialCriterion::PARTIAL_INTERSECTION); + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(src), NN_NO_CHECK(dst), ctxt); + ASSERT_GE(list.size(), 1U); + EXPECT_EQ(list[0]->nameStr(), "BD72 to ETRS89 (3) + " + "Inverse of ETRS89 to Ostend height (1) + " + "ETRS89 to NAP height (2) + " + "Inverse of Amersfoort to ETRS89 (9)"); + EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +proj=axisswap +order=2,1 " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=hgridshift +grids=be_ign_bd72lb72_etrs89lb08.tif " + "+step +proj=vgridshift +grids=be_ign_hBG18.tif +multiplier=1 " + "+step +inv +proj=vgridshift +grids=nl_nsgi_nlgeo2018.tif " + "+multiplier=1 " + "+step +inv +proj=hgridshift +grids=nl_nsgi_rdtrans2018.tif " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"); +} + +// --------------------------------------------------------------------------- + TEST(operation, compoundCRS_to_compoundCRS_issue_2720) { auto dbContext = DatabaseContext::create(); auto objSrc = WKTParser().attachDatabaseContext(dbContext).createFromWKT( @@ -4689,6 +4981,223 @@ // --------------------------------------------------------------------------- +TEST(operation, compoundCRS_to_compoundCRS_issue_3152_ch1903lv03_ln02_bound) { + auto dbContext = DatabaseContext::create(); + auto authFactory = AuthorityFactory::create(dbContext, std::string()); + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + ctxt->setSpatialCriterion( + CoordinateOperationContext::SpatialCriterion::PARTIAL_INTERSECTION); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + auto wkt = + "COMPOUNDCRS[\"CH1903 / LV03 + LN02 height\",\n" + " BOUNDCRS[\n" + " SOURCECRS[\n" + " PROJCRS[\"CH1903 / LV03\",\n" + " BASEGEOGCRS[\"CH1903\",\n" + " DATUM[\"CH1903\",\n" + " ELLIPSOID[\"Bessel " + "1841\",6377397.155,299.1528128,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",4149]],\n" + " CONVERSION[\"Map projection of CH1903 / LV03\",\n" + " METHOD[\"Hotine Oblique Mercator (variant B)\",\n" + " ID[\"EPSG\",9815]],\n" + " PARAMETER[\"Latitude of projection " + "centre\",46.9524055555556,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8811]],\n" + " PARAMETER[\"Longitude of projection " + "centre\",7.43958333333333,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8812]],\n" + " PARAMETER[\"Azimuth of initial line\",90,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8813]],\n" + " PARAMETER[\"Angle from Rectified to Skew " + "Grid\",90,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8814]],\n" + " PARAMETER[\"Scale factor on initial line\",1,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8815]],\n" + " PARAMETER[\"Easting at projection " + "centre\",600000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8816]],\n" + " PARAMETER[\"Northing at projection " + "centre\",200000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8817]]],\n" + " CS[Cartesian,2],\n" + " AXIS[\"easting\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " AXIS[\"northing\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",21781]]],\n" + " TARGETCRS[\n" + " GEOGCRS[\"WGS 84\",\n" + " DATUM[\"World Geodetic System 1984\",\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,2],\n" + " AXIS[\"latitude\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"longitude\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " ID[\"EPSG\",4326]]],\n" + " ABRIDGEDTRANSFORMATION[\"MyTransformation from CH1903 to " + "WGS84\",\n" + " METHOD[\"Position Vector transformation (geog2D " + "domain)\",\n" + " ID[\"EPSG\",9606]],\n" + " PARAMETER[\"X-axis translation\",674.374,\n" + " ID[\"EPSG\",8605]],\n" + " PARAMETER[\"Y-axis translation\",15.056,\n" + " ID[\"EPSG\",8606]],\n" + " PARAMETER[\"Z-axis translation\",405.346,\n" + " ID[\"EPSG\",8607]],\n" + " PARAMETER[\"X-axis rotation\",0,\n" + " ID[\"EPSG\",8608]],\n" + " PARAMETER[\"Y-axis rotation\",0,\n" + " ID[\"EPSG\",8609]],\n" + " PARAMETER[\"Z-axis rotation\",0,\n" + " ID[\"EPSG\",8610]],\n" + " PARAMETER[\"Scale difference\",1,\n" + " ID[\"EPSG\",8611]]]],\n" + " VERTCRS[\"LN02 height\",\n" + " VDATUM[\"Landesnivellement 1902\"],\n" + " CS[vertical,1],\n" + " AXIS[\"gravity-related height\",up,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",5728]]]"; + auto srcObj = createFromUserInput(wkt, dbContext, false); + auto src = nn_dynamic_pointer_cast(srcObj); + ASSERT_TRUE(src != nullptr); + auto authFactoryEPSG = + AuthorityFactory::create(dbContext, std::string("EPSG")); + auto dst = authFactoryEPSG->createCoordinateReferenceSystem( + "9518"); // "WGS 84 + EGM2008 height" + + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(src), dst, ctxt); + ASSERT_GE(list.size(), 1U); + // Check that BoundCRS helmert transformation is used + EXPECT_EQ(list[0]->nameStr(), + "Inverse of Map projection of CH1903 / LV03 + " + "MyTransformation from CH1903 to WGS84 + " + "Inverse of ETRS89 to WGS 84 (1) + " + "Inverse of ETRS89 to LN02 height + " + "ETRS89 to WGS 84 (1) + " + "WGS 84 to EGM2008 height (1)"); + EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +inv +proj=somerc +lat_0=46.9524055555556 " + "+lon_0=7.43958333333333 +k_0=1 " + "+x_0=600000 +y_0=200000 +ellps=bessel " + "+step +proj=push +v_3 " + "+step +proj=cart +ellps=bessel " + "+step +proj=helmert +x=674.374 +y=15.056 +z=405.346 " + "+rx=0 +ry=0 +rz=0 +s=0 +convention=position_vector " + "+step +inv +proj=cart +ellps=GRS80 " + "+step +proj=pop +v_3 " + "+step +proj=vgridshift " + "+grids=ch_swisstopo_chgeo2004_ETRS89_LN02.tif " + "+multiplier=1 " + "+step +inv +proj=vgridshift +grids=us_nga_egm08_25.tif " + "+multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"); + + auto listInv = CoordinateOperationFactory::create()->createOperations( + dst, NN_NO_CHECK(src), ctxt); + ASSERT_GE(listInv.size(), 1U); + EXPECT_EQ(listInv[0]->nameStr(), + "Inverse of WGS 84 to EGM2008 height (1) + " + "Inverse of ETRS89 to WGS 84 (1) + " + "ETRS89 to LN02 height + " + "ETRS89 to WGS 84 (1) + " + "Inverse of MyTransformation from CH1903 to WGS84 + " + "Map projection of CH1903 / LV03"); +} + +// --------------------------------------------------------------------------- + +TEST(operation, + compoundCRS_to_compoundCRS_issue_3191_BD72_Ostend_height_to_WGS84_EGM96) { + auto dbContext = DatabaseContext::create(); + auto authFactory = AuthorityFactory::create(dbContext, std::string()); + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + // BD72 + Ostend height + auto srcObj = createFromUserInput("EPSG:4313+5710", dbContext, false); + auto src = nn_dynamic_pointer_cast(srcObj); + ASSERT_TRUE(src != nullptr); + auto authFactoryEPSG = + AuthorityFactory::create(dbContext, std::string("EPSG")); + auto dst = authFactoryEPSG->createCoordinateReferenceSystem( + "9707"); // "WGS 84 + EGM96 height" + + { + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(src), dst, ctxt); + ASSERT_GE(list.size(), 1U); + EXPECT_EQ(list[0]->nameStr(), + "BD72 to ETRS89 (3) + " + "Inverse of ETRS89 to Ostend height (1) + " + "ETRS89 to WGS 84 (1) + " + "WGS 84 to EGM96 height (1)"); + const char *expected_proj = + "+proj=pipeline " + "+step +proj=axisswap +order=2,1 " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=hgridshift +grids=be_ign_bd72lb72_etrs89lb08.tif " + "+step +proj=vgridshift +grids=be_ign_hBG18.tif +multiplier=1 " + "+step +inv +proj=vgridshift +grids=us_nga_egm96_15.tif " + "+multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"; + EXPECT_EQ( + list[0]->exportToPROJString(PROJStringFormatter::create().get()), + expected_proj); + } + + { + auto list = CoordinateOperationFactory::create()->createOperations( + dst, NN_NO_CHECK(src), ctxt); + ASSERT_GE(list.size(), 1U); + EXPECT_EQ(list[0]->nameStr(), "Inverse of WGS 84 to EGM96 height (1) + " + "Inverse of ETRS89 to WGS 84 (1) + " + "ETRS89 to Ostend height (1) + " + "Inverse of BD72 to ETRS89 (3)"); + const char *expected_proj = + "+proj=pipeline " + "+step +proj=axisswap +order=2,1 " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1 " + "+step +inv +proj=vgridshift +grids=be_ign_hBG18.tif +multiplier=1 " + "+step +inv +proj=hgridshift +grids=be_ign_bd72lb72_etrs89lb08.tif " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"; + EXPECT_EQ( + list[0]->exportToPROJString(PROJStringFormatter::create().get()), + expected_proj); + } +} + +// --------------------------------------------------------------------------- + TEST(operation, vertCRS_to_vertCRS) { auto vertcrs_m_obj = PROJStringParser().createFromPROJString("+vunits=m"); @@ -5907,6 +6416,61 @@ // --------------------------------------------------------------------------- +TEST(operation, + compoundCRS_of_horizCRS_with_TOWGS84_vertCRS_with_geoid_model_to_geogCRS) { + auto authFactory = + AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + ctxt->setSpatialCriterion( + CoordinateOperationContext::SpatialCriterion::PARTIAL_INTERSECTION); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + auto wkt = "COMPD_CS[\"NAD83(CSRS) + CGVD28 height - HT2_0\",\n" + " GEOGCS[\"NAD83(CSRS)\",\n" + " DATUM[\"NAD83_Canadian_Spatial_Reference_System\",\n" + " SPHEROID[\"GRS 1980\",6378137,298.257222101,\n" + " AUTHORITY[\"EPSG\",\"7019\"]],\n" + " TOWGS84[0,0,0,0,0,0,0],\n" + " AUTHORITY[\"EPSG\",\"6140\"]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " AUTHORITY[\"EPSG\",\"8901\"]],\n" + " UNIT[\"degree\",0.0174532925199433,\n" + " AUTHORITY[\"EPSG\",\"9122\"]],\n" + " AUTHORITY[\"EPSG\",\"4617\"]],\n" + " VERT_CS[\"CGVD28 height - HT2_0\",\n" + " VERT_DATUM[\"Canadian Geodetic Vertical Datum of " + "1928\",2005,\n" + " EXTENSION[\"PROJ4_GRIDS\",\"HT2_0.gtx\"],\n" + " AUTHORITY[\"EPSG\",\"5114\"]],\n" + " UNIT[\"metre\",1,\n" + " AUTHORITY[\"EPSG\",\"9001\"]],\n" + " AXIS[\"Gravity-related height\",UP],\n" + " AUTHORITY[\"EPSG\",\"5713\"]]]"; + auto srcObj = + createFromUserInput(wkt, authFactory->databaseContext(), false); + auto src = nn_dynamic_pointer_cast(srcObj); + ASSERT_TRUE(src != nullptr); + // NAD83(CSRS) 3D + auto dst = authFactory->createCoordinateReferenceSystem("4955"); + + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(src), dst, ctxt); + ASSERT_EQ(list.size(), 1U); + auto op_proj = + list[0]->exportToPROJString(PROJStringFormatter::create().get()); + EXPECT_EQ(op_proj, "+proj=pipeline " + "+step +proj=push +v_1 +v_2 " + "+step +proj=axisswap +order=2,1 " + "+step +proj=unitconvert +xy_in=deg +xy_out=rad " + "+step +proj=vgridshift +grids=HT2_0.gtx +multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1 " + "+step +proj=pop +v_1 +v_2"); +} + +// --------------------------------------------------------------------------- + TEST(operation, compoundCRS_from_WKT2_to_geogCRS_3D_context) { auto authFactory = AuthorityFactory::create(DatabaseContext::create(), "EPSG"); @@ -6135,6 +6699,139 @@ // --------------------------------------------------------------------------- +TEST(operation, + boundCRS_to_compoundCRS_with_hubCRS_same_as_compound_geographicCRS) { + auto authFactory = + AuthorityFactory::create(DatabaseContext::create(), "EPSG"); + auto ctxt = CoordinateOperationContext::create(authFactory, nullptr, 0.0); + ctxt->setSpatialCriterion( + CoordinateOperationContext::SpatialCriterion::PARTIAL_INTERSECTION); + ctxt->setGridAvailabilityUse( + CoordinateOperationContext::GridAvailabilityUse:: + IGNORE_GRID_AVAILABILITY); + auto wkt = + "BOUNDCRS[\n" + " SOURCECRS[\n" + " PROJCRS[\"CH1903 / LV03\",\n" + " BASEGEOGCRS[\"CH1903\",\n" + " DATUM[\"CH1903\",\n" + " ELLIPSOID[\"Bessel " + "1841\",6377397.155,299.1528128,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",6149]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8901]]],\n" + " CONVERSION[\"unnamed\",\n" + " METHOD[\"Hotine Oblique Mercator (variant B)\",\n" + " ID[\"EPSG\",9815]],\n" + " PARAMETER[\"Latitude of projection " + "centre\",46.9524055555556,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8811]],\n" + " PARAMETER[\"Longitude of projection " + "centre\",7.43958333333333,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8812]],\n" + " PARAMETER[\"Azimuth of initial line\",90,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8813]],\n" + " PARAMETER[\"Angle from Rectified to Skew Grid\",90,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433],\n" + " ID[\"EPSG\",8814]],\n" + " PARAMETER[\"Scale factor on initial line\",1,\n" + " SCALEUNIT[\"unity\",1],\n" + " ID[\"EPSG\",8815]],\n" + " PARAMETER[\"Easting at projection centre\",600000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8816]],\n" + " PARAMETER[\"Northing at projection centre\",200000,\n" + " LENGTHUNIT[\"metre\",1],\n" + " ID[\"EPSG\",8817]]],\n" + " CS[Cartesian,3],\n" + " AXIS[\"y\",east,\n" + " ORDER[1],\n" + " LENGTHUNIT[\"metre\",1,\n" + " ID[\"EPSG\",9001]]],\n" + " AXIS[\"x\",north,\n" + " ORDER[2],\n" + " LENGTHUNIT[\"metre\",1,\n" + " ID[\"EPSG\",9001]]],\n" + " AXIS[\"ellipsoidal height (h)\",up,\n" + " ORDER[3],\n" + " LENGTHUNIT[\"metre\",1,\n" + " ID[\"EPSG\",9001]]]]],\n" + " TARGETCRS[\n" + " GEOGCRS[\"WGS 84\",\n" + " ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n" + " MEMBER[\"World Geodetic System 1984 (Transit)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G730)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G873)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G1150)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G1674)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G1762)\"],\n" + " MEMBER[\"World Geodetic System 1984 (G2139)\"],\n" + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ENSEMBLEACCURACY[2.0]],\n" + " PRIMEM[\"Greenwich\",0,\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " CS[ellipsoidal,3],\n" + " AXIS[\"geodetic latitude (Lat)\",north,\n" + " ORDER[1],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"geodetic longitude (Lon)\",east,\n" + " ORDER[2],\n" + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n" + " AXIS[\"ellipsoidal height (h)\",up,\n" + " ORDER[3],\n" + " LENGTHUNIT[\"metre\",1]],\n" + " ID[\"EPSG\",4979]]],\n" + " ABRIDGEDTRANSFORMATION[\"Transformation from CH1903 to WGS84\",\n" + " METHOD[\"Position Vector transformation (geog2D domain)\",\n" + " ID[\"EPSG\",9606]],\n" + " PARAMETER[\"X-axis translation\",674.4,\n" + " ID[\"EPSG\",8605]],\n" + " PARAMETER[\"Y-axis translation\",15.1,\n" + " ID[\"EPSG\",8606]],\n" + " PARAMETER[\"Z-axis translation\",405.3,\n" + " ID[\"EPSG\",8607]],\n" + " PARAMETER[\"X-axis rotation\",0,\n" + " ID[\"EPSG\",8608]],\n" + " PARAMETER[\"Y-axis rotation\",0,\n" + " ID[\"EPSG\",8609]],\n" + " PARAMETER[\"Z-axis rotation\",0,\n" + " ID[\"EPSG\",8610]],\n" + " PARAMETER[\"Scale difference\",1,\n" + " ID[\"EPSG\",8611]]]]"; + auto srcObj = + createFromUserInput(wkt, authFactory->databaseContext(), false); + auto src = nn_dynamic_pointer_cast(srcObj); + ASSERT_TRUE(src != nullptr); + auto dst = authFactory->createCoordinateReferenceSystem( + "9518"); // "WGS 84 + EGM2008 height" + + auto list = CoordinateOperationFactory::create()->createOperations( + NN_NO_CHECK(src), dst, ctxt); + ASSERT_GE(list.size(), 1U); + // Check that BoundCRS helmert transformation is used + EXPECT_EQ(list[0]->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +inv +proj=somerc +lat_0=46.9524055555556 " + "+lon_0=7.43958333333333 +k_0=1 " + "+x_0=600000 +y_0=200000 +ellps=bessel " + "+step +proj=cart +ellps=bessel " + "+step +proj=helmert +x=674.4 +y=15.1 +z=405.3 +rx=0 +ry=0 +rz=0 " + "+s=0 +convention=position_vector " + "+step +inv +proj=cart +ellps=WGS84 " + "+step +inv +proj=vgridshift +grids=us_nga_egm08_25.tif " + "+multiplier=1 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg " + "+step +proj=axisswap +order=2,1"); +} + +// --------------------------------------------------------------------------- + TEST(operation, IGNF_LAMB1_TO_EPSG_4326) { auto authFactory = AuthorityFactory::create(DatabaseContext::create(), std::string()); @@ -6505,6 +7202,32 @@ } // --------------------------------------------------------------------------- + +TEST(operation, + createOperation_fallback_to_proj4_strings_with_axis_inverted_projCRS) { + auto objSrc = + createFromUserInput("EPSG:2193", DatabaseContext::create(), false); + auto src = nn_dynamic_pointer_cast(objSrc); + ASSERT_TRUE(src != nullptr); + + auto objDest = PROJStringParser().createFromPROJString( + "+proj=longlat +ellps=WGS84 +lon_wrap=180 +type=crs"); + auto dest = nn_dynamic_pointer_cast(objDest); + ASSERT_TRUE(dest != nullptr); + + auto op = CoordinateOperationFactory::create()->createOperation( + NN_CHECK_ASSERT(src), NN_CHECK_ASSERT(dest)); + ASSERT_TRUE(op != nullptr); + EXPECT_EQ(op->exportToPROJString(PROJStringFormatter::create().get()), + "+proj=pipeline " + "+step +proj=axisswap +order=2,1 " + "+step +inv +proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 " + "+x_0=1600000 +y_0=10000000 +ellps=GRS80 " + "+step +proj=longlat +ellps=WGS84 +lon_wrap=180 " + "+step +proj=unitconvert +xy_in=rad +xy_out=deg"); +} + +// --------------------------------------------------------------------------- TEST(operation, compoundCRS_to_proj_string_with_non_metre_height) { auto objSrc =